settle

settle: revisión de facturas con IA y un humano en el circuito

Claude vision lee las facturas y marca anomalías contra el propio historial de cada proveedor, con cada alerta sujeta a aprobación humana antes del pago.

Solo: diseño, desarrollo, infraestructura
TypeScriptNext.jsClaude APINeonDrizzlePlaywright

TL;DR

  • Claude vision lee las facturas y marca anomalías contra el propio historial de cada proveedor.
  • 55 tests unitarios + 14 e2e corren contra una base de datos real, no contra mocks.
  • Una separación deliberada entre IA y lógica determinista. La automatización total era la decisión equivocada.

Problema

Los sobreprecios se esconden en los renglones.

Las facturas de cuentas por pagar entierran sobrecargos en comisiones, SKUs cambiados y precios unitarios que suben de a poco. Quienes revisan ojean decenas por día y aprueban por confianza: el renglón malo es justo el que nadie lee. settle lee cada renglón para que el humano solo mire donde importa.

Arquitectura

carga → extracción con Claude vision → diff contra historial del proveedor → cola de alertas → triage humano → escritura en el ledger

Decisiones clave

Claude vision en lugar de OCR + reglas

Elegí un modelo de visión sobre OCR por plantilla porque los formatos de factura varían demasiado para usar plantillas. Trade-off: mayor costo y latencia por página, amortizados con caching y batching.

Humano en el circuito en lugar de automatización total

Elegí frenar los cargos marcados para aprobación humana en vez de rechazarlos automáticamente. Trade-off: menor throughput, pero un único rechazo automático equivocado erosiona la confianza más rápido de lo que cualquier ganancia de velocidad la construye.

Anomalía contra historial del proveedor en lugar de umbrales fijos

Elegí comparar cada cargo contra las facturas pasadas del propio proveedor en lugar de reglas fijas en dólares. Trade-off: necesita un período de calentamiento del historial antes de que las alertas se afinen, pero detecta desvíos que los umbrales se pierden.

Tests contra base de datos real en lugar de mocks

Elegí Playwright contra una rama real de Neon en lugar de datos mockeados. Trade-off: CI más lento, pero detectó bugs de migración de Drizzle que los mocks habrían ocultado hasta producción.

El trabajo del modelo no es decidir; es hacer que la decisión del humano sea rápida. Una vez que optimicé para velocidad de triage en lugar de precisión automatizada, la arquitectura correcta se volvió obvia.

la idea que reformuló el producto

Más difícil de lo esperado

Lograr que el camino de IA y el determinista coincidieran en una sola forma de los datos. El modelo devuelve confianza difusa; el ledger necesita centavos exactos. Reconciliar ambos (y decidir dónde vive el redondeo) llevó más tiempo que el propio pipeline de visión.

Resultados

  • 55 + 14: tests unitarios + e2e, base de datos real
  • Cada alerta: sujeta a aprobación humana antes del pago
  • 0 rechazos automáticos: deciden los humanos

Demo

captura → triage de alertas → cockpit

Código