7月5日、Simon Willisonが「sqlite-utils 4.0rc2, mostly written by Claude Fable (for about $149.25)」と題した記事を公開した。この記事では、AnthropicのAIコーディングエージェント「Claude Fable(claude-fable-5)」を使ってsqlite-utils 4.0のリリース候補版を大部分自律的に開発した実録について詳しく紹介されている。プロンプト設計・最終判断・コードレビュー指示はWillisonが担いつつ、実装・バグ修正・リリースノート執筆の大半をエージェントに委託するという開発スタイルの記録だ。
約$149でOSSのメジャーバージョンを大部分書き上げた
sqlite-utilsはSimon Willisonが開発・メンテナンスするPython製のSQLiteユーティリティライブラリだ。4.0はトランザクション処理を大きく刷新するメジャーリリースで、6月にrc1を公開済みだった。
rc2の開発には37プロンプト、34コミット、30ファイルに及ぶ+1,321/-190行のコード変更が伴ったが、これらの大部分をClaude Fableが担った。作業はiPhoneのClaude Code for webから開始し、Fableが10〜15分かけてタスクを処理している間、Willisonは地元のパレードを楽しむといった具合に進めた。
費用の内訳は以下のとおりだ:
| セッション | モデル | コスト |
|---|---|---|
| メインセッション | claude-fable-5 | $141.02 |
| APIサーフェス調査エージェント | claude-fable-5 | $2.40 |
| トランザクション/atomic レビューエージェント | claude-fable-5 | $2.39 |
| rc1以降のコミットレビューエージェント | claude-fable-5 | $1.72 |
| マイグレーションレビューエージェント | claude-fable-5 | $1.40 |
| プロンプトカウントエージェント | claude-opus-4(※元記事の表記のまま) | $0.32 |
| 合計 | $149.25 |
費用の計算にはAgentsViewを活用した。AgentsViewはClaude Codeセッションのコストを可視化・集計するサードパーティ製ツールで、Claude Code for webのセッション上でuvx agentsview --helpを実行し、コスト推定を行うよう指示するだけで取得できたという。
なお、Willisonは月額$200のClaude Maxプランに加入しており、実際には追加課金なしで利用している。7月7日の「Fablepocalypse」以降はMax加入者もAPI実費負担となる。Fablepocalypseとは、それまでMax加入者が従量課金なしで利用できていたClaude Codeのコスト体系が変更され、API使用分が実費負担になるイベントとして広く呼ばれている名称だ。今回の開発は、その変更直前の駆け込み的な活用となった。
最初のレビューで「データ消失バグ」が発覚
最初のプロンプトは単純だった:
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()ラッパーなしでself.db.execute()経由でDELETEを実行する。接続がin_transaction=Trueのままになるため、その後のatomic()呼び出しがすべてsavepointブランチに入り、コミットされない。
実際に再現すると、削除・挿入・テーブル作成がすべてロールバックされてしまう。静かにデータが消えるバグだ。Fableはコードと再現手順の両方を提示した。
別モデルによる相互レビューで追加の問題も検出
Fableによる修正が一段落した後、今度はCodex Desktop + GPT-5.5に変更点のレビューを依頼した。Willisonは「1つのモデルが別モデルの成果物をレビューする手法は以前は懐疑的だったが、実際に機能するので習慣になった」と述べている。
GPT-5.5はさらに2件の問題を発見した:
db.query("update ...")がValueErrorを投げる前にDELETE/UPDATEをコミットしてしまうINSERT ... RETURNINGがイテレータを全消費しないとコミットされないため、next(db.query(...))のような一般的な使い方でトランザクションが開きっぱなしになる
どちらもドキュメントの記述と矛盾する挙動で、Fableが再度修正した(該当PR)。
4.0rc2の主な破壊的変更
今回のRCで確定した主な破壊的変更は以下のとおりだ:
db.execute()による書き込みが自動コミットされるように。以前は暗黙のトランザクションが開いたまま残り、接続を閉じると黙ってロールバックされていたdb.query()がジェネレータの初回イテレーション前にSQLを実行するように変更。INSERT ... RETURNINGが即時コミットされるようになった- Python APIのバリデーションエラーが
AssertionErrorからValueErrorに変更。-Oフラグ(最適化モード)でassertが無効化される問題への対処 upsert()が主キーなしのレコードでPrimaryKeyRequiredを送出するように。従来は黙って新規挿入されていた- **Python 3.12+の
autocommit=True/Falseオプションで作成した接続を渡すとTransactionError**を送出するように
リリースノートもFable生成
Willisonはリリースノートについて「以前は手書き方針だったが、正直Fableが書いたものの方が自分で作るより良い」と評している。変更が入るたびにchangelogの「Unreleased」セクションに追記させ、changelogのコミット履歴がそのままリリースの変更サマリーとして機能する運用にした。
また「リリースノートは退屈で予測可能で正確であるべき文章なので、エージェントに外注して問題ない」とも述べており、AIに任せる/任せないの判断基準を明確に示している。プロンプト設計・コードレビュー指示・最終判断はWillisonが担い、定型的・網羅的な記述が求められる部分はエージェントに委ねるという役割分担が、今回の開発全体を通じた基本方針だった。
詳細はsqlite-utils 4.0rc2, mostly written by Claude Fable (for about $149.25)を参照していただきたい。