Simon Willison, creador de Datasette y una de las voces más leídas del ecosistema Python, publicó sqlite-utils 4.0rc2 tras usar Claude Fable como asistente para una revisión final antes del release estable. El proyecto siguió SemVer durante toda su historia y Willison prefiere que sus versiones mayores con cambios incompatibles sean lo más raras posible, así que el trabajo previo era ineludible.

El primer prompt fue simple, ejecutado desde Claude Code para web en su iPhone.

"Final review before shipping a stable 4.0 release - very important to spot any last minute things that would be a breaking change if we fix them later", escribió Willison.

El reporte inicial del modelo devolvió problemas serios: cinco release blockers que Willison todavía no había detectado.

¿Cuál era el bug más grave?

El peor de todos afectaba directamente la integridad de datos, un tipo de falla que suele terminar en tickets de rollback urgentes. En palabras del propio modelo.

"Table.delete_where() (sqlite_utils/db.py:2948) ejecuta su DELETE con un self.db.execute() desnudo, sin envoltorio atomic(). La conexión queda con in_transaction=True, así cada llamada atomic() posterior toma la rama de savepoint y nunca hace commit."

El resultado reproducido: insertás filas, hacés un delete_where, insertás una fila más, creás otra tabla, cerrás. Al reabrir la base, el delete, la fila nueva y la tabla adicional habían desaparecido. Todo perdido en silencio.

¿Cuánto cambió en el código?

Durante 37 prompts, 34 commits y +1.321 -190 líneas de código en 30 archivos, Willison y Fable trabajaron todo el feedback en orden, con mejoras de diseño adicionales por el camino.

"Una cosa rara de los agentes de codificación es que las tareas más difíciles ofrecen más oportunidad de hacer otras cosas al mismo tiempo, porque el agente a veces necesita 10-15 minutos para procesar cada tarea", explicó Willison. "Salí a disfrutar el desfile del 4 de julio en Half Moon Bay, revisando y prompteando el siguiente paso desde el teléfono."

El nuevo modelo transaccional

El cambio más significativo fue el manejo de transacciones. La nueva documentación aclara el contrato del release:

"Cada método de esta librería que escribe a la base ejecuta dentro de su propia transacción y hace commit antes de retornar. Los cambios quedan guardados en disco apenas termina la llamada. Existen exactamente dos situaciones donde necesitás pensar en transacciones: cuando querés agrupar varias operaciones para que todas fallen o triunfen juntas, y cuando manejás una transacción manualmente con db.begin()."

Revisando la documentación, Willison detectó un detalle propio: sqlite-utils no soporta las conexiones con autocommit=True o autocommit=False de Python 3.12, porque commit() y rollback() se comportan distinto. Eso rompía casi toda la suite de tests. Con la ayuda del modelo, garantizó que la diferencia no rompiera la librería.

Review cruzada con GPT-5.5

Willison ejecutó una revisión final con Codex Desktop y GPT-5.5 xhigh, práctica que hoy repite habitualmente: hacer que el mejor modelo de Anthropic revise el trabajo de OpenAI y viceversa.

"Solía pensar que la idea de tener un modelo revisando el trabajo de otro era algo absurda, se sentía raramente supersticioso", escribió Willison. "El problema es que realmente funciona."

El GPT encontró dos bugs adicionales de tipo P1: db.query() con statements de escritura hacía auto-commit antes de tirar ValueError, y INSERT ... RETURNING no committeaba hasta agotar el generador. Willison pasó los hallazgos a una nueva sesión de Fable, que confirmó ambos problemas y los solucionó en otro PR.

¿Cuánto costó todo esto?

Willison pagó USD 200 al mes por el plan Claude Max 20x para tener más allowance de Fable antes del 7 de julio, fecha en que suscriptores Max deberán pagar costo API completo por el modelo. Curioso por saber el costo real de la corrida, corrió AgentsView dentro de la sesión y obtuvo el número: USD 149,25 sin subsidio.

"Estoy muy contento de estar en esa suscripción", cerró.

Contexto para desarrolladores en Chile y LatAm

Willison escribe habitualmente release notes a mano, pero para 4.0rc2 dejó que Fable las produjera y las revisó al vuelo. Su conclusión: son mejores de las que él escribiría. Es una señal replicable para equipos chilenos que trabajan con sqlite-utils o Datasette (usada por medios como La Nación y algunas ONGs locales para publicar datasets): el patrón "modelo revisor + modelo ejecutor" duplica la cobertura de bugs a costo relativamente bajo, siempre que se pueda pagar el peaje del par de suscripciones.