Un escribano, no un autor.
La única llamada a un modelo sin supervisión convierte lo que dije en estructura. Nada de lo que lee un cliente se escribe sin que yo esté en el proceso.
Elegí extracción en vez de generaciónReportes semanales para clientes, con recibos.
Construí Receipts para escribir los reportes de estado semanales que mis clientes de verdad leen. Cada afirmación del reporte apunta a algo que registré, así que nada se infla y nada se pierde.
Northwind Dental
Weekly status report
Sep 21 – 27, 2026 · W39
Prepared for Dana Ruiz
Prepared by Jesús Martínez
Executive summary
Delivered. Four improvements to online booking and appointment reminders.
Live. Patients can book online again without the checkout error.
Decided. Reminders move to email, and SMS is retired.
Needed. The new logo files, to finish the email templates.
1. What was delivered
Por qué lo construí
Mis clientes no son técnicos. Cada semana necesitan saber qué se hizo, qué está en vivo y qué necesito de ellos. Escribirlo a mano era lento, y mi historial de commits dejaba fuera lo que más les importa: la llamada en la que cambiamos el plan, la decisión que destrabó un lanzamiento, el despliegue que arregló su pago en línea.
El giro
La primera versión escribía los reportes directamente desde GitHub: entraban pull requests y salía prosa amable para el cliente. El modelo llenaba cada vacío con seguridad. El trabajo parecía más terminado de lo que estaba, y una semana con dos reuniones con el cliente y un despliegue a producción, pero sin commits, salía como una semana tranquila.
El código estaba fusionado. Nada se había desplegado.Esta semana lanzamos a producción el nuevo flujo de reservas.
El nuevo flujo de reservas está terminado y a la espera de su lanzamiento.E-31Cada afirmación remite a una entrada del ledger que puedo mostrar.
Así que le di la vuelta. El ledger es el producto.
Ahora el modelo es un escribano, no un autor. Convierte lo que le digo en hechos estructurados, el reporte se construye solo con esos hechos y, antes de que nada salga, verifico que cada frase remita a uno de ellos.
Cómo funciona
Durante la semana le escribo o le mando notas de voz a un bot de Telegram, en inglés o en español. GitHub y Linear se sincronizan solos cada tres horas.
Un modelo convierte cada mensaje en entradas del ledger: trabajo, despliegue, reunión, decisión, bloqueo. Si digo “en realidad eso fue en staging”, corrige la entrada en vez de crear una nueva.
A las 6:30 p. m. el bot pregunta por cada cliente: esto se sincronizó hoy, ¿algo que agregar? Un toque si no hay nada.
El día del reporte, Claude Code redacta el reporte a partir del ledger de la semana en una sesión que yo superviso. La primera compuerta es un mapa de evidencia que vincula cada afirmación con una entrada.
Envío un PDF limpio y en lenguaje claro: qué se entregó, qué está en vivo, las decisiones que tomamos y qué necesito de ti.
Cómo funciona, en 30 segundos
Elige un mensaje para el bot y mira cómo se convierte en una entrada del ledger y luego en una línea del borrador del reporte, con la entrada que la respalda. Prueba la corrección después del despliegue.
Aún no hay nada registrado. Envíale un mensaje al bot.
Nada todavía.
Nada salió en vivo esta semana.
Nada todavía.
Nada todavía.
Una explicación simplificada con datos inventados, no la interfaz real.
Por dentro
La única llamada a un modelo sin supervisión convierte lo que dije en estructura. Nada de lo que lee un cliente se escribe sin que yo esté en el proceso.
Elegí extracción en vez de generaciónEl reporte no puede decir en vivo, lanzado o en producción a menos que una entrada de despliegue de esa semana nombre el entorno. Staging se dice staging.
Elegí una regla de vocabulario en vez de confiar en la prosaCada llamada reconstruye su contexto desde las tablas de mensajes y entradas. Sin flujos en pausa, y cada tarea programada se pone al día si se pierde una ejecución.
Elegí tareas sin estado en vez de flujos de larga duraciónLas reglas que sigue
El modelo solo convierte mis palabras en hechos estructurados. Nunca escribe para el cliente.
“En realidad eso fue en staging” actualiza la entrada existente en vez de agregar otra.
“En vivo” y “lanzado” necesitan una entrada de despliegue que nombre el entorno.
Antes de que salga un reporte, cada frase se vincula al ledger. Si no se puede, se elimina.
Sin pull requests, ramas ni tickets. Lo que el cliente ya puede hacer y qué problema desapareció.
Los reportes cuentan lo que pasó, nunca lo que podría pasar.
Bitácora
Python en una máquina virtual: traer la actividad de GitHub, pedirle a Claude una narrativa, generar un PDF y dejarlo como borrador en Gmail. Probó la idea y nada más.
Next.js, tareas en segundo plano y reportes escritos desde la actividad en git. Rápida y pulida, y equivocada de una forma que tardó meses en notarse.
Captura por Telegram y voz, preguntas por la tarde y redacción supervisada. Moví todo a Neon (base de datos, funciones, almacenamiento) y eliminé el pipeline viejo y las capas construidas para pruebas que nunca se escribieron.
Lo que aprendí
Va a llenar el vacío, y va a sonar seguro. Dale los hechos, o haz que pregunte.
“En vivo” es una afirmación. Ata cada afirmación fuerte a una evidencia y todo el reporte se vuelve confiable.
La versión 2 se simplificó al quitar dos plataformas y una capa de abstracción que nadie usaba.
Lo próximo para Receipts: Slack y un widget de chat como nuevas formas de registrar, sobre el mismo camino de entrada.