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 (кредиты использования).

ℹ Что такое 'Fablepocalypse'?
В сообществе разработчиков период окончания включённого доступа к Claude Fable 5 в подписках прозвали «Fablepocalypse» — датой, после которой модель стала доступна только через платные usage credits. Уиллисон активно использовал оставшиеся дни для максимально эффективной работы с Fable.

Промпт с 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 — таблицу. Раньше каждая из них молча удаляла объект неправильного типа, если имя совпадало.

Итоговая таблица найденных багов

#КомпонентОписание багаКритичностьСтатус
1delete_where()Не фиксирует изменения, «отравляет» соединение — потеря данных🔴 БлокерИсправлен
2db.query()Коммит до проверки типа запроса, генератор не исчерпывается🔴 БлокерИсправлен
3Database() + Python 3.12 autocommitВсе записи молча теряются при закрытии соединения🔴 БлокерИсправлен
4drop-table / drop-viewМолча удаляют объект неправильного типа🟠 СерьёзныйИсправлен
5optimize(), rebuild_fts()Не фиксируют изменения — аналог бага #1🔴 БлокерИсправлен
⚠ Важно для пользователей sqlite-utils 4.0rc1
Если вы тестировали sqlite-utils 4.0rc1, рекомендуется срочно перейти на 4.0rc2. Баг с 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 актуален». Этого оказалось достаточно, чтобы обнаружить ещё два вопроса, заслуживающих внимания.

💡 Совет по AI-разработке
Практика перекрёстной проверки — когда модель одного вендора проверяет работу другой — становится всё более распространённой среди опытных разработчиков. Разные модели имеют разные «слепые пятна», поэтому такой подход позволяет выловить ошибки, которые одна модель могла пропустить.

Стратегия делегирования: экономим токены 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 ProClaude Max 5xClaude Max 20xAPI (Fable 5)
Цена/мес$20$100$200Pay-per-token
Лимит использованияБазовый5× от Pro20× от ProБез лимита
Fable 5 включёнДо 7 июля*До 7 июля*До 7 июля*Нет (оплата отдельно)
Стоимость Fable 5$10/млн вх. + $50/млн исх. токенов
Подходит дляБазовых задачАктивных разработчиковАгентной разработкиAPI-интеграций

*После 7 июля 2026 — только через usage credits.

Claude Fable 5 оценивается в $10 за миллион входных токенов и $50 за миллион выходных токенов, с существующей 90% скидкой на входные токены при использовании prompt caching (кэширования промптов).

📝 Расчёт стоимости
Если перевести $149.25 в токены по базовому тарифу: это примерно 3 миллиона входных токенов или около 3 миллионов слов контекста кода, тестов и документации. Для ревью и доработки библиотеки среднего размера — вполне реалистичный объём работы для агентного кодирования.

Что это значит для разработчиков

История Уиллисона поднимает несколько важных вопросов:

1. AI как ревьюер кода работает — и особенно хорошо перед релизом. Fable нашёл критические баги, которые сам автор не замечал в процессе разработки, включая баг с потерей данных.

2. Перекрёстная проверка моделей — разумная практика. Разные LLM имеют разные слабые места, и использование модели одного вендора для проверки работы другой даёт дополнительный уровень контроля.

3. Release notes можно делегировать — рутинный, но важный тип текстов, где точность важнее стиля. ИИ справляется с этим хорошо.

4. Экономика имеет значение — $149 за финальный аудит серьёзного open source проекта — это разумная цена. Но важно понимать, что это часть дорогой подписки, и для большинства пользователей такая модель потребует осознанного планирования бюджета.

Мне нравится использовать агентов для release notes — они должны быть скучными, предсказуемыми и точными. Именно в этом ИИ хорош.

Стабильный релиз sqlite-utils 4.0 ожидается в ближайшее время — rc2 уже доступен для тестирования на PyPI.