powered by TechFeed
表示モード
Deep Dive

AIエージェントにOSSのメジャーバージョンをほぼ丸ごと開発させたら約149ドルかかった — データが黙って消えるバグも自力で発見

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が最初に送ったプロンプトはシンプルなもの...

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)を参照していただきたい。