
sqlite-utils 4.0: как Claude Fable написал релиз за $149
Саймон Уиллисон рассказывает, как Claude Fable 5 помог выпустить sqlite-utils 4.0rc2, найдя критические баги и написав release notes — всего за $149.
sqlite-utils 4.0: как Claude Fable написал релиз за $149
Саймон Уиллисон, создатель популярных Python-инструментов sqlite-utils и Datasette, опубликовал подробный разбор того, как он использовал Claude Fable 5 для финальной подготовки версии 4.0 своей библиотеки. Результат оказался неожиданно показательным — не только в части возможностей модели, но и в плане экономики AI-ассистированной разработки.
Контекст: что такое sqlite-utils и почему важен релиз 4.0
sqlite-utils — это Python-библиотека и CLI-утилита (интерфейс командной строки) для работы с базами данных SQLite. Инструмент широко используется для быстрой загрузки, трансформации и исследования данных — особенно в связке с Datasette.
Версия 4.0 — мажорный (major) релиз, то есть он содержит обратно несовместимые изменения. Уиллисон придерживается SemVer (семантического версионирования) и старается выпускать такие версии как можно реже.
Я стараюсь следовать SemVer и хочу, чтобы несовместимые мажорные версии выходили как можно реже.
Именно поэтому перед финальным релизом ему было важно провести тщательный предрелизный аудит.
Claude Fable 5: модель с дедлайном
Claude Fable 5 — это модель класса Mythos, которую Anthropic сделала безопасной для широкого использования. Её возможности превосходят любую из ранее выпущенных моделей компании: она демонстрирует исключительную производительность в разработке ПО, интеллектуальной работе, научных исследованиях и других областях.
Уиллисон решил воспользоваться моделью, пока у него оставался доступ к Claude Fable в рамках подписки Max — оставалось всего несколько дней до окончания этого периода. Он хотел довести sqlite-utils 4.0 до стабильного релиза, которым был бы полностью доволен.
Для подписчиков планов Pro, Max, Team и ряда Enterprise-планов Fable 5 был доступен в рамках до 50% еженедельного лимита использования вплоть до 7 июля, после чего перешёл на оплату через usage credits (кредиты использования).
Промпт с iPhone и первый шок
Уиллисон начал с простого запроса в Claude Code for web прямо со своего iPhone: «Финальная проверка перед выпуском стабильной версии 4.0 — очень важно выявить все последние проблемы, которые окажутся breaking change, если их исправить позже».
Среди найденных проблем оказались весьма серьёзные — 5 из них Fable классифицировал как «блокеры релиза» (release blockers).
Критический баг: потеря данных в delete_where()
Самая серьёзная из находок — настоящий баг с потерей данных:
Был исправлен баг, при котором table.delete_where(), table.optimize() и table.rebuild_fts() не фиксировали (commit) свои изменения, оставляя соединение внутри открытой транзакции. Последующие записи могли молча откатиться (rollback) при закрытии соединения. Теперь все три метода используют db.atomic(), как и другие методы записи.
Чтобы наглядно показать масштаб проблемы, Fable воспроизвёл баг:
import sqlite_utils
db = sqlite_utils.Database("dw.db")
db["t"].insert_all([{"id": i} for i in range(3)], pk="id")
# Удаляем одну запись
db["t"].delete_where("id = ?", [0])
# conn.in_transaction теперь True — соединение «отравлено»!
db["t"].insert({"id": 50})
db["u"].insert({"a": 1})
db.close()
# При повторном открытии: строки [0, 1, 2] на месте,
# строка 50 и таблица u — исчезли
Уиллисон сам признал: это действительно серьёзный баг. Но, по крайней мере, его можно было бы исправить в патч-версии 4.0.1, не нарушая SemVer — он сам даже не думал о том, как sqlite-utils взаимодействует с новым параметром autocommit, появившимся в Python 3.12.
Баг с порядком операций в db.query()
Обнаружился ещё один коварный баг: db.query() сначала вызывал self.execute(), который автоматически фиксировал запись, и только потом проверял cursor.description. Это означало, что db.query("update ...") завершал транзакцию ещё до возбуждения ValueError. Кроме того, коммит INSERT…RETURNING находился в конце возвращаемого генератора и никогда не срабатывал, если итератор не был полностью исчерпан.
Проблема совместимости с Python 3.12 autocommit
Теперь Database() выбрасывает sqlite_utils.db.TransactionError, если ему передать соединение, созданное с параметрами autocommit=True или autocommit=False из Python 3.12+. На таких соединениях commit() и rollback() ведут себя иначе, что раньше приводило к молчаливой потере всех записей при закрытии соединения.
Путаница с drop-table и drop-view
Команда sqlite-utils drop-table теперь отказывается удалять представление (view), а drop-view — таблицу. Раньше каждая из них молча удаляла объект неправильного типа, если имя совпадало.
Итоговая таблица найденных багов
| # | Компонент | Описание бага | Критичность | Статус |
|---|---|---|---|---|
| 1 | delete_where() | Не фиксирует изменения, «отравляет» соединение — потеря данных | 🔴 Блокер | Исправлен |
| 2 | db.query() | Коммит до проверки типа запроса, генератор не исчерпывается | 🔴 Блокер | Исправлен |
| 3 | Database() + Python 3.12 autocommit | Все записи молча теряются при закрытии соединения | 🔴 Блокер | Исправлен |
| 4 | drop-table / drop-view | Молча удаляют объект неправильного типа | 🟠 Серьёзный | Исправлен |
| 5 | optimize(), rebuild_fts() | Не фиксируют изменения — аналог бага #1 | 🔴 Блокер | Исправлен |
delete_where() может приводить к молчаливой потере данных: изменения внешне выглядят применёнными, но при закрытии соединения откатываются.Как работал процесс: от промпта до PR
graph TD
A[Промпт с iPhone\nв Claude Code for web] --> B[Fable анализирует\nкодовую базу]
B --> C[Отчёт: 5 блокеров\nрелиза]
C --> D[Fable воспроизводит\nкаждый баг]
D --> E[Написание исправлений\n+ тестов]
E --> F[Добавление в changelog\nраздел 'Unreleased']
F --> G[Перекрёстная проверка\nGPT-5.5 и Codex Desktop]
G --> H[sqlite-utils 4.0rc2]
Fable добавлял каждое изменение в раздел «Unreleased» в файле changelog по мере его внесения — Уиллисон проверял их по ходу работы. Это дало дополнительный эффект: история коммитов changelog стала лаконичной сводкой всех изменений, вошедших в релиз.
Раньше Уиллисон придерживался политики написания release notes вручную, но признаёт: сгенерированные заметки оказались лучше тех, что он написал бы сам. Release notes — отличный пример текста, который он готов отдать агентам, потому что они должны быть скучными, предсказуемыми и точными.
Перекрёстная проверка: один ИИ проверяет другой
Уиллисон признаётся, что раньше идея проверки работы одной модели другой казалась ему абсурдной — что-то вроде суеверия. Но это действительно работает: он взял за привычку просить лучшую модель Anthropic проверять работу OpenAI и наоборот, потому что это достаточно часто даёт полезные результаты.
Он запустил Codex Desktop и GPT-5.5 с промптом: «Проверь изменения с момента последнего RC. Также убедись, что changelog актуален». Этого оказалось достаточно, чтобы обнаружить ещё два вопроса, заслуживающих внимания.
Стратегия делегирования: экономим токены Fable
Один из самых интересных советов Уиллисон получил на встрече с командой Claude Code: нужно давать Fable (и, в некоторой степени, Opus) возможность использовать собственное суждение, а не диктовать, как именно работать. Например, в отношении тестирования: лучше сказать Fable «используй собственное суждение при написании тестов», чем задавать жёсткие правила.
Джесси Винсент поделился связанным советом: просить Fable использовать другие, менее мощные модели для небольших задач, самостоятельно определяя, какую модель выбрать.
В результате Fable сохранил себе в memory-файл следующее:
name: delegate-coding-to-subagents
description: Simon wants coding tasks delegated to subagents
running an appropriately lower-power model
Stated by Simon on 2026-07-03:
"For all coding tasks use your judgement to decide an
appropriate lower power model and run that in a subagent."
Why: cost/efficiency — implementation work rarely needs
the top-tier model; judgment, review, and synthesis
stay with the main loop.
По словам Уиллисона, стратегия работает: он успевает сделать очень много, а лимит Fable расходуется медленнее, чем раньше.
Цена вопроса: $149.25 на весь релиз
Уиллисон перешёл на план Claude Max за $200/месяц (ранее он платил $100/месяц), чтобы увеличить лимит Fable на оставшееся время до «Fablepocalypse» — момента, когда даже подписчики Claude Max должны будут платить полную стоимость API за использование модели.
Итоговые ~$149.25 — это часть этой подписки, потраченная на работу над sqlite-utils 4.0rc2.
Сравнение планов Claude Max и стоимости API
| Параметр | Claude Pro | Claude Max 5x | Claude Max 20x | API (Fable 5) |
|---|---|---|---|---|
| Цена/мес | $20 | $100 | $200 | Pay-per-token |
| Лимит использования | Базовый | 5× от Pro | 20× от Pro | Без лимита |
| Fable 5 включён | До 7 июля* | До 7 июля* | До 7 июля* | Нет (оплата отдельно) |
| Стоимость Fable 5 | — | — | — | $10/млн вх. + $50/млн исх. токенов |
| Подходит для | Базовых задач | Активных разработчиков | Агентной разработки | API-интеграций |
*После 7 июля 2026 — только через usage credits.
Claude Fable 5 оценивается в $10 за миллион входных токенов и $50 за миллион выходных токенов, с существующей 90% скидкой на входные токены при использовании prompt caching (кэширования промптов).
Что это значит для разработчиков
История Уиллисона поднимает несколько важных вопросов:
1. AI как ревьюер кода работает — и особенно хорошо перед релизом. Fable нашёл критические баги, которые сам автор не замечал в процессе разработки, включая баг с потерей данных.
2. Перекрёстная проверка моделей — разумная практика. Разные LLM имеют разные слабые места, и использование модели одного вендора для проверки работы другой даёт дополнительный уровень контроля.
3. Release notes можно делегировать — рутинный, но важный тип текстов, где точность важнее стиля. ИИ справляется с этим хорошо.
4. Экономика имеет значение — $149 за финальный аудит серьёзного open source проекта — это разумная цена. Но важно понимать, что это часть дорогой подписки, и для большинства пользователей такая модель потребует осознанного планирования бюджета.
Мне нравится использовать агентов для release notes — они должны быть скучными, предсказуемыми и точными. Именно в этом ИИ хорош.
Стабильный релиз sqlite-utils 4.0 ожидается в ближайшее время — rc2 уже доступен для тестирования на PyPI.