作品 21
Verse Tools
Verse を支える開発者ツール 6 種。自作 Sentry 相当のエラー計装、LLM キャッシュ、フレーキー診断、セレクタ自己修復、録画→テスト生成
2課題
本体の開発環境へ言語モデルの対話機能を載せるにあたり、二つの欠落が同時に見えていた。一つは、既存の API 形式のまま応答を流しながら費用の上限を実際に効かせる中継がないこと。もう一つは、開発を支える側の道具立てがないことである。テストが理由なく落ちる、本番の例外が手元へ届かない、手で確かめた操作を再現テストへ起こせないといった問題が、それぞれ別々に放置されていた。いずれも本体へ同梱できる形で揃える必要があった。
3要件・制約
制約は三つに整理できる。第一に、応答は既存の API 形式のまま流し続けること — 呼び出し側の実装を書き換えずに前へ挟めることが前提である。第二に、費用の上限は再起動をまたいで効くこと。第三に、本体は Rust で書かれているため、境界は言語に依存しない取り決めで結ぶこと。あわせて外部依存は最小限に抑えた。
4設計
中心には、外部依存を一切持たない共有パッケージを置いた。集合の濃度推定、分位点の逐次要約、確率的な集合判定、区間和、密度によるクラスタリング、変化点の検出、外れ値の孤立度といった算法をここへ自前に実装し、上に載る道具はすべてここから部品を取る。その上へ、エラー計装、セレクタの自己修復、不安定なテストの環境相関診断、操作記録からのテスト生成、応答キャッシュを別々のパッケージとして並べた。本体との境界は、起動時の引数で待ち受け口を渡し、管理操作は専用のヘッダで識別するという最小限の取り決めに固定してある。
6実装
実行・束ね・テスト・ワークスペース管理はいずれも Bun という単一のランタイムに寄せてあり、成果物は単一の実行ファイルへ落ちる形になっている。エラー計装は、収集器、ブラウザ側と実行環境側それぞれの送信部、閲覧画面、エージェント連携、コマンド行という部品に分けた。閲覧画面だけが React に依存し、それ以外の部品は依存を持たない。テストの規模は本節末の計測に示す。
テスト — 84 ファイル / 1,036 ケース(llmcache 単体 200)— ドキュメント記載値と実測が完全一致1
7性能対策
費用の上限は当初、実行中の記憶だけで数えていた。これでは再起動のたびに使用量が消え、上限が事実上機能しない。bun:sqlite で永続化した記録の上で、まず予約を取り、成否に応じて確定または解放するという二段の手順へ組み替え、期限を過ぎた孤立予約は起動時に回収する形にした。確認と加算の間へ別の呼び出しが割り込む隙も、この手順で閉じている。応答を素通しする経路については、多バイト文字が塊の境界で割れる場合、終端の目印が届く場合、事象の区切りが塊をまたぐ場合をそれぞれテストで固定した。キャッシュの鍵は、要求されたモデルではなく実際に呼ばれたモデルを基準に取り直している。
8結果
別系統の言語モデルによる五観点の独立レビューを掛けたところ、本体と応答キャッシュの境界で、待ち受け口の不一致と応答の形の不一致という致命的な契約破壊が見つかった。あわせて上限の回避経路も複数指摘された。修正は二巡で収束し、再レビューでは重大度の高い指摘がゼロになっている。境界そのものを固定する契約テストは、この回に追加したものである。検出と収束の内訳は本節末の計測に示す。
レビュー成果 — Rust↔TS 境界の P0 契約破壊 2 件と予算ガードのバイパス 3 件を検出 → 2 ラウンドで 0 CRITICAL/0 HIGH に収束2
9検証で判明した注意点
版管理上はコミットが一件もなく、全ファイルが索引に載ったままである。リモートも設定していない。公開するにはまず初回のコミットが要る。
継続的統合の定義ファイルは置いてあるが、本線にコミットがないため一度も走っていない。したがって「テストが通っている」とは書けない — 全件通過は自己記録であり、この検証では実行していない。
配布用の署名は実装しておらず、生成される実行ファイルは常に未署名である。
着手時期は本人の申告であって、ファイル更新時刻の最古とは一致しない。期間は年の前半という幅で記している。
10AI 支援の関与
応答キャッシュの改修では実装を一方の言語モデルが担い、もう一方が五観点の敵対的レビューを担うという役割分担を取っており、境界の契約破壊と上限の回避経路はいずれもレビュー側から出た指摘である。