AI変更検証AI
AIが書いた変更、本当に要件どおりで、既存を壊していないと言い切れますか。
無料ベータ・面談制/正式版は有料提供予定
前提:change/requirement/testsの3点セット(requirementはREQ-ID+受入条件文+参照シンボル/ファイル名を含めること)
- 所要時間: 30分
- 進め方: 現場の状況をヒアリングし、最初に効くツールと順番を一緒に決めます
- ご準備は不要です
概要
AIに任せた実装は「それらしく」見えても、要件の一部が未実装だったり、テストが無いまま通っていたり、要件に無い変更が紛れ込んでいたりします。人手のレビューはこの3種の穴を取りこぼしがちです。マージ前に「変更×要件×テスト」の三点照合を機械化することで、退行と要件漏れを入口で止めます。
効果
- 要件に対する未実装を漏れなく洗い出す。
- テストの無い変更を検出し、退行・正しさの未確認を防ぐ。
- 要件に無い混入を可視化し、想定外の変更・退行リスクを抑える。
- 各指摘に「どこを実装する/どのテストを足す」までの直し方が付く。
- 同じ入力に同じ結果(決定的)なので、CIのブロッキングゲートに組み込める。
インプット
- 変更内容
- 要件
- テスト
汎用LLMとの違い
「変更×要件×テスト」をカバーの抜けとして漏れなく数え上げる照合の設計と、表記ゆれを吸収して同一視する抽出・正規化規則が bubo 独自の中核です。汎用LLMと違い、大きな変更でも取りこぼさず、同じ入力に同じ結果を返す再現性を提供します。
実際の入力と、返ってきた出力
同じ変更diff・要件・テスト記述を ai-change-verify にそのまま渡した実際の出力です(要約ではありません)。
※ 5つのhunkに分かれた実際のdiffのうち、掲載スペースの都合で先頭と末尾を抜粋しています。要件・テスト記述は全文です。
【AIが出した変更(diff・抜粋)】
diff --git a/src/refund_batch.py b/src/refund_batch.py
@@ -1,4 +1,4 @@
-"""Refund batch processing."""
+"""Refund batch processing (scaled feature)."""
+
+def apply_refund(session_id, amount):
+ """Apply a refund for a completed checkout session."""
+ return {"session_id": session_id, "amount": amount}
(中略:_validate_refund_window / _log_refund_event / _notify_finance_team が
それぞれ別のhunkとして追加される)
@@ -80,3 +90,11 @@
+def _normalize_legacy_currency_code(code):
+ """Normalize legacy 2-letter currency codes to ISO-4217 3-letter codes."""
+ _LEGACY_MAP = {"US": "USD", "JP": "JPY"}
+ return _LEGACY_MAP.get(code, code)
【要件】
# 要件: 部分返金機能のスケール実装
対象ファイル: src/refund_batch.py
- `apply_refund` を実装し、完了済みセッションへの返金を適用できること
- `_validate_refund_window` で返金可能期間外の返金を拒否できること
- `_log_refund_event` で返金の監査イベントを記録できること
- `_notify_finance_team` で財務チームへ返金発生を通知できること
【テスト記述】
# テスト: 部分返金機能のスケール実装(src/refund_batch.py 対象)
- `apply_refund` が返金額をレコードへ正しく反映することを検証するテスト
- `_validate_refund_window` が期間外の返金を拒否することを検証するテスト
- `_log_refund_event` が監査イベントを記録することを検証するテスト
- `_normalize_legacy_currency_code` が旧2文字コードをISO-4217へ変換することを検証するテスト
# AI変更の検証結果
## 指摘一覧(2件)
### 1. この変更を検証するテストが無く、正しさ・退行有無を確認できない
- 場所: _notify_finance_team
- 直し方: `_notify_finance_team` を参照・検証するテストを追加する
- 指摘ID: `ea6725e8b877`(report_outcome で正否・採否を記録できます)
### 2. 要件に無いシンボル/ファイルが変更に含まれ、要件外の混入・退行リスクがある
- 場所: _normalize_legacy_currency_code
- 直し方: `_normalize_legacy_currency_code` が要件のどこに対応するか確認し、無ければ分離/取り消す
- 指摘ID: `62a3bb10d577`(report_outcome で正否・採否を記録できます)
あわせて機械可読な判定も返ります(抜粋):
{
"change_symbols": ["_log_refund_event", "_normalize_legacy_currency_code",
"_notify_finance_team", "_validate_refund_window", "apply_refund"],
"change_files": ["src/refund_batch.py"],
"verdict": {
"verified": false,
"verifiable": true,
"n_gaps": 2,
"by_kind": {"unimplemented_requirement": 0, "untested_change": 1, "scope_creep": 1}
}
}
本ツールは変更diffから抽出したシンボル一覧(5件)と要件・テスト記述を機械的に突き合わせ、指摘をscope_creep/untested_changeという固定の種別とverdictに落とし、同じ入力なら常に同じ2件を同じ順で返します。指摘IDで採否も記録できます。
社外秘のコードを、どう守るか
buboは入力を保存しません
ツールに渡したコード・仕様・データを、buboのサーバーは保存しません。bubo自身が学習に使うこともなく、処理はその場限りです。
AIに送るか・どこへ送るかは、あなたが握ります
標準のキーレス接続では、意味を読む処理は普段お使いのAIクライアントの中で実行されます。データの扱いは、お客様とそのプロバイダの既存のご契約のもとにあり、buboがAPIキーやコードをお預かりすることはありません。ご自身の契約するプロバイダを直接指定したい場合は、BYOK(Bring Your Own Key)として任意で設定できます。
AIに送らず動くツールも多くあります
多くのツールは決定的な静的解析だけで完結し、LLMに渡すのは必要な場面に限られます。AIに送る範囲を、あなた自身で絞り込めます。
ワンタイムコードは単回使用・有効期限7日・サーバーに平文保存はしません。発行したトークンは設定ファイルに直書きせず環境変数で参照します。既存のMCP設定がある場合も、壊さず冪等にマージします。
どう申し込み、どうつなぐのか
1. 面談を予約する
予約フォームから面談をお申し込みください。現在のQAの困りごとと、試したいツールをお聞かせいただきます。
2. 面談で適用先を一緒に決める
そろえたツールのうち、貴社の工程で効く順番をご一緒に見立てます。ワンタイムコードと接続コマンドは、面談後にあわせてお渡しします。
3. コード1つ、コマンド1行で接続
お受け取りしたワンタイムコードで、コマンドを1行実行(Windows / mac / Linux 各1行)。有効化・MCP設定(.mcp.json)生成・環境変数設定まで自動で完了します。あとはAIクライアント(Claude Code / Gemini CLI)を再起動するだけで、そのままQA方法論を呼び出せます。APIキーのご用意は不要です。ご自身の契約するLLMを使いたい場合は、BYOK(Bring Your Own Key)として任意で設定いただけます。