BlueProject
Published on

Crédito Colombia — libro editable y clasificador de intención

Authors
  • avatar
    Name
    Mateo Londoño Toro
    Twitter

Continúa de 5 hubs y billetera de plásticos. Parte del proyecto Crédito Colombia.

Home de Gastos ya no es “revisar correos”. El libro es la fuente; Gmail es el sensor. El 23 de agosto publiqué el libro editable y el clasificador de intención (8aa9fc9, +3.2k / −384 en 59 archivos).

Prod: credito.mateolondono.dev. Auth: AuthPortal.

Cadena que ya corre

Avisos Nequi / Bancolombia (Gmail Push)
Parseo + clasificación (QR, llaves, fallidos; bancos no se mezclan)
JSON clasificado → import al libro (lotes, sin timeout de Vercel)
Libro: tabla, periodo, cuenta, edición en lote
Intención: hábito / comercio (reglas, mapa, aprendizaje)

Gmail no es el sistema de registro. Si el movimiento ya está en el libro, el aviso pendiente se cierra. Transferencias que no son del usuario se pueden buscar y sacar del libro.

Push + catálogo de remitentes (dominio real de alertas Bancolombia). Cron de catch-up una vez al día por el límite Hobby de Vercel. Confirmar no debe volver a mostrar el mismo aviso; al clasificar se pueden crear hábitos.

Mockup de ejemplo: libro y pipeline Gmail

Imagen de ejemplo (mockup). Sin correos reales ni datos personales.

Parseo: no mezclar bancos ni HTML colapsado

Avisos de QR Bancolombia y avance Bogotá no se juntan. QR, llaves y fallidos tienen tipo propio. No tomar PSE del HTML colapsado del correo: el collapse miente.

Export “Por clasificar” lleva correos, parseo e ids de Gmail. Mapas de comerciantes van versionados. Deduplicación y revisión salen a JSON aparte para no mezclar “ya está en el libro” con “el parser falló”.

Import al libro: inserta en lote y parte la carga para no pegarle el timeout de Vercel. Si la tarjeta no existe, se crea al importar.

Ver el correo completo: HTML en iframe, body plano, scroll del menú. Toasts arriba; remitentes en modal.

Libro (UI)

En /inbox (pestaña Clasificar gastos del hub Billetera):

  • Tabla con periodo y cuenta en dos selectores.
  • Filtros, paginación y edición en lote (tipo, hábito, instrumento).
  • Merge de fichas de instrumento duplicadas (/api/instruments/merge).
  • Detalle de fila sin perder el contexto de la tabla.

KPIs por mes en cada instrumento. Gastos es bandeja de hábitos; Avance dejó de ser “instrumento”.

Intención (motor)

src/domain/gmail/intent-classify.ts + migración 0010_intent_classify.sql.

No es un LLM en el request. Fuentes explícitas:

FuenteQué hace
hard_ruleIntereses, mora, comisión de avance, cuota de manejo. Avance/envío/pago → transfer.
merchant_mapComercio conocido → slug de presupuesto.
regex / scoreSeñales ponderadas.
learnedConfirmaciones en DB; candidato hasta umbral (LEARNED_MIN = 3).

Gates (decideFromScores): A auto (top ≥ 20 y margen ≥ 10 vs segundo); B revisar (margen corto); C no asignar (top bajo o vacío). Inbound no se categoriza como gasto. Si el texto es solo el procesador (PSE / Mercado Pago / Bold / dLocal), needsReview: no clasificar el rail como comercio.

Un aviso “PSE · Rappi” no debería quedar como “PSE”. splitMerchantEntities recorta el procesador y deja el comercio.

Aprendizaje: merchant-learn-repository + estados candidate | learned | conflict. El usuario corrige en lote; el motor acumula.

Fixture: fixtures/gmail/intent-gold.json + scripts/eval-intent-classify.ts.

Corte de git que alimenta esto (22–23 ago)

  • Exportar transacciones Gmail → JSON (paginación, deduplicación, mapas versionados).
  • Clasificar al sincronizar; separar bancos; no PSE desde HTML collapse.
  • Import JSON + crear tarjetas; lotes por Hobby Vercel.
  • Libro tabla + quitar transferencias ajenas + cerrar avisos ya en libro.
  • Publicar libro editable + intención (8aa9fc9).

Qué no es este post

No es un changelog de cada hotfix de extractos PDF o del cron. El punto de producto: el escenario de crédito se ancla a instrumentos reconciliados y a un libro que se puede corregir, no a un feed de notificaciones.

Sin checkpoint, “llevas 2.1Mde2.1M de 8M” es falsa precisión. El clasificador reduce trabajo; no certifica el saldo del banco.

Si quieres probar el flujo: módulo credito en AuthPortal y el runtime Next en CreditoColombia-FinancialOS-git.