7月5日、Simon Willisonが「sqlite-utils 4.0rc2, mostly written by Claude Fable (for about $149.25)」と題した記事を公開した。この記事では、AIコーディングエージェント「Claude Fable」を使ってOSSライブラリ「sqlite-utils 4.0」をほぼ丸ごと開発した実録と、その実費約149ドルの内訳が詳しく紹介されている。
独立記念日(4th of July)のパレードをiPhoneで楽しみながら、AIエージェントが10〜15分かけてタスクをこなすのを待つ——Willisonが描くAIコーディングの風景は、「AIとペアプロする」というより「AIに仕事を投げて自分は別のことをする」に近い。その結果生まれたのが、37プロンプト・34コミット・+1,321行のコード変更というメジャーバージョンアップだ。しかもFableはリリース直前に、データが黙って消えるバグを自力で発見してみせた。
Fableが見つけたリリースブロッカー:データが黙って消えるバグ
Willisonが最初に送ったプロンプトはシンプルなものだった。
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
このプロンプトに対してFableが生成したレビューレポートには、「リリースブロッカー」5件が含まれていた。最も深刻なものがこれだ。
delete_where()がコミットされず、コネクションを汚染する(データロス)
Table.delete_where()はatomic()ラッパーなしで DELETE を実行するため、コネクションがin_transaction=Trueのまま残る。その後のatomic()呼び出しはすべてセーブポイントブランチに入り、コミットされない。
実際の再現コードも提示された:
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] のまま。削除も、row 50も、テーブルuも消えている。
Willisonは「4.0.1のポイントリリースで修正できるバグであってよかった。設計上の欠陥だったら5.0を強いられるところだった」と述べている。
GPT-5.5による相互レビューで追加バグも発見
作業の後半でWillisonは、FableがレビューしたコードをさらにGPT-5.5(xhigh設定、OpenAIの最新推論モデル)でレビューするという「モデルがモデルの仕事をレビューする」アプローチを採った。
Willisonはかつてこのアプローチを「奇妙な迷信めいた行為」と思っていたと認めつつも、AnthropicのモデルでOpenAIの成果をレビューし、その逆も行うことを習慣にしていると述べている。実際に今回も2件の問題が発見された。
db.query("update ...")を呼ぶと、ValueErrorを発生させる前にUPDATEがコミットされてしまうINSERT ... RETURNINGをジェネレータとして返す実装で、イテレーションを完了させないとコミットされない(next(db.query(...))だけで止めると書き込みがロールバックされる)
これらはPR #768で修正された。
約149ドルでOSSのメジャーバージョンをリリースする
sqlite-utilsは、WillisonがメンテナンスするPython製のSQLiteユーティリティライブラリだ。Datasetteプロジェクトとも密接に関連しており、コマンドラインやPython APIからSQLiteを手軽に操作できるツールとして広く使われている。
今回使用した「Claude Fable」は、Anthropicが提供するClaudeの最新フラッグシップモデルで、長時間のエージェント的作業に適した設計となっている。WillisonはClaudeの$200/月「Claude Max」プランに加入しており、今回の作業はそのサブスクリプション枠内で実施した。記事のポイントは「AIに何を任せたか」ではなく、実際にいくらかかったのかという具体的な数字にある。Willisonは作業終了後、AgentsView(Claudeセッション内のトークン消費をコストとして集計・可視化するツール)を使って費用を算出した。
| セッション | モデル | コスト |
|---|---|---|
| メインセッション | Claude Fable | $141.02 |
| APIサーフェス調査エージェント | Claude Fable | $2.40 |
| トランザクション/atomic調査 | Claude Fable | $2.39 |
| RC1以降のコミット調査 | Claude Fable | $1.72 |
| マイグレーション調査 | Claude Fable | $1.40 |
| プロンプトカウントエージェント | Claude Opus 4 | $0.32 |
| 合計 | $149.25 |
WillisonはMax加入者向けFable無制限提供が終了する「Fablepocalypse」(2026年7月7日にAnthropicが予告していた使用制限の開始)に備え、プランを$100/月から$200/月へ増額してFable枠を確保した上で今回の作業に臨んだ。実際の支払いはサブスクリプション料金内に収まっているが、API従量課金に換算すれば約149ドルに相当する作業量だったということだ。
37プロンプト、34コミット、30ファイルの変更
作業規模は37プロンプト、34コミット、+1,321 -190行のコード変更、30ファイルに及んだ。「難しいタスクほど、エージェントが10〜15分考えている間に他のことができる」というWillisonの観察は、AIコーディングの実態をよく表している。
今回のRC2で最も重要な変更はトランザクション処理の刷新だ。新しいドキュメントでは、ライブラリの基本動作を次のように明文化している。
insert()、upsert()、delete()などデータベースへの書き込みを行うすべてのメソッドは、それぞれ独自のトランザクション内で実行され、返却前にコミットされる。commit()を呼ぶ必要はなく、変更を永続化するためにデータベースをクローズする必要もない。
また、Python 3.12で追加された sqlite3.connect(..., autocommit=True) オプションを使ったコネクションを渡すと TransactionError が発生するよう修正された。以前はテストスイートのほぼ全件が失敗する状態だったという。
リリースノートはAIに任せる、という判断
Willisonはリリースノートの執筆をFableに委ねたことについて「過去は手書きポリシーだったが、正直、自分が書くより良い出来だ」と述べている。「リリースノートは退屈で、予測可能で、正確である必要がある。そういう文章はエージェントに外注していい」という判断だ。
一方で反省もある。Willisonは記事の中で「もっとサブエージェントと安価なモデルを活用すべきだった」と自身の過去の助言を引き合いに出し、$141のメインセッションコストが高くついた点を指摘している。次回以降は作業をより細かく分割し、軽量モデルを使い分けることでコストを抑えられると見ている。
詳細はsqlite-utils 4.0rc2, mostly written by Claude Fable (for about $149.25)を参照していただきたい。