メインコンテンツへスキップ
TOP/ サービス/ MCPツール/ 堅牢性チェック
BETA / QA向けMCP / robustness-lint実装・コードレビュー

堅牢性チェック

想定外の入力が来たとき、そのコードは例外で落ちませんか。

無料ベータ・面談制/正式版は有料提供予定

Python 決定的(LLM不使用)

前提:Python実装コードのみ対応

  • 所要時間: 30分
  • 進め方: 現場の状況をヒアリングし、最初に効くツールと順番を一緒に決めます
  • ご準備は不要です

概要

「動いた=壊れない」ではありません。要素アクセスや検証なしの数値変換などは、正常系では通っても、未知の値・空・数値でない入力・空の並びといったエッジで例外を投げて落ちます。こうした脆さはハッピーパスのテストでは見つからないため、つくる瞬間に機械的に先回りで拾います。

効果

  • エッジ入力で例外を投げて落ちる箇所を、実装時に位置・深刻度・直し方つきで把握できる。
  • 決定的(同入力同出力)なので、CIで検出件数・重大度をしきい値にしてビルドを止められる。
  • 存在・空・メンバ確認や try で守られた操作は陰性にする保守的判定でノイズが少ない。
  • 誤検出が多い対象(スライスや安全な既知キーアクセス等)は検出対象から外している。
  • 残る誤検出は report_outcome で報告すればallowlistに載り、以後は自動で抑制される(サーバは何も保存しないステートレス設計)。

インプット

  • 実装コード(Python)

汎用LLMとの違い

危険操作の種別・脆さカタログ・ガード判定手順(存在/空/メンバ確認・try の解釈)が bubo 独自の中核です。汎用LLMに「このコード壊れない?」と聞くと運次第ですが、本ツールは構文木の規則照合で機械的に拾い、同じ入力には必ず同じ結果を返します。

EXAMPLE

実際の入力と、返ってきた出力

同じコードと問いかけを、汎用AIと robustness-lint にそのまま渡した実際のやりとりです(要約ではありません)。

入力したコード(実物)
# projects/alarm-controller/src/trigger.py
class TriggerDetector:
    def poll(self, raw_buffer: list[int]) -> TriggerSample:
        read_ms = POLL_PERIOD_MS
        latest = self._read_latest_sample(raw_buffer)
        pulled = latest == 1
        return TriggerSample(pulled=pulled, read_ms=read_ms)

    def _read_latest_sample(self, buffer: list[int]) -> int:
        """信号バッファ先頭(最新)のサンプル値を読み取る。"""
        first = buffer[0]
        return first
汎用AIの回答(実測)
raw_buffer が空/None のときにクラッシュする点は的中させましたが、read_ms が固定値でタイムアウト判定が実質機能していない点(妥当ではあるが未知の指摘)や、バッファ値が0/1以外だった場合の誤認識(推測)もあわせて指摘し、示した3件のうち2件はラベル外の指摘でした。
robustness-lint の回答(実測そのまま)
検出1件(unguarded_sequence_index/medium)
- シーケンスの固定位置(先頭/末尾)を空チェックなしで参照しており、空入力で IndexError を投げて落ちる
- 場所: _read_latest_sample (line 50)
- 直し方: 参照前に空でないこと(if seq: / len(seq))を確認するか、try/except で IndexError を扱う

recall = 1.0(既知欠陥を的中)。

汎用LLMは同じコードに対しても実行のたびに指摘が変動しやすく、バグを直した後のコードにまで想像で指摘を追加してしまうことがあります。実際、バグを修正済みの清潔なコードに対しても、既に空チェック済みであるにもかかわらず汎用LLMは新たに4件の指摘を作り出しましたが、robustness-lintは決定的な静的解析のため、修正後のコードには何も指摘せず「pass」と即答します。誤検出(false positive)の少なさが、実運用でのアラート疲れを左右します。

社外秘のコードを、どう守るか

buboは入力を保存しません

ツールに渡したコード・仕様・データを、buboのサーバーは保存しません。bubo自身が学習に使うこともなく、処理はその場限りです。

AIに送るか・どこへ送るかは、あなたが握ります

標準のキーレス接続では、意味を読む処理は普段お使いのAIクライアントの中で実行されます。データの扱いは、お客様とそのプロバイダの既存のご契約のもとにあり、buboがAPIキーやコードをお預かりすることはありません。ご自身の契約するプロバイダを直接指定したい場合は、BYOK(Bring Your Own Key)として任意で設定できます。

AIに送らず動くツールも多くあります

多くのツールは決定的な静的解析だけで完結し、LLMに渡すのは必要な場面に限られます。AIに送る範囲を、あなた自身で絞り込めます。

ワンタイムコードは単回使用・有効期限7日・サーバーに平文保存はしません。発行したトークンは設定ファイルに直書きせず環境変数で参照します。既存のMCP設定がある場合も、壊さず冪等にマージします。

どう申し込み、どうつなぐのか

STEP 1

1. 面談を予約する

予約フォームから面談をお申し込みください。現在のQAの困りごとと、試したいツールをお聞かせいただきます。

STEP 2

2. 面談で適用先を一緒に決める

そろえたツールのうち、貴社の工程で効く順番をご一緒に見立てます。ワンタイムコードと接続コマンドは、面談後にあわせてお渡しします。

STEP 3

3. コード1つ、コマンド1行で接続

お受け取りしたワンタイムコードで、コマンドを1行実行(Windows / mac / Linux 各1行)。有効化・MCP設定(.mcp.json)生成・環境変数設定まで自動で完了します。あとはAIクライアント(Claude Code / Gemini CLI)を再起動するだけで、そのままQA方法論を呼び出せます。APIキーのご用意は不要です。ご自身の契約するLLMを使いたい場合は、BYOK(Bring Your Own Key)として任意で設定いただけます。

← QA向けMCPツール一覧へ戻る

AIの番人になる道具「Nioh」を、まず試す

貴社のQA工程に合わせて、Niohのどのツールから始めるかをご一緒に見立てます。無料ベータの枠には限りがあります。まずは面談からお気軽にどうぞ。