このプロジェクトについて
testgraphは、ジャーニーレベルのテストセレクターです。git diffが与えられると、変更によってどのユーザー向けフローが壊れた可能性があるか、およびどのような順序でテストすべきかを判断し、すべてを再実行させるのではなく、ランク付けされた短いリストを返します。本ツールは意図的にブラウザの操作、テストの生成、セルフヒーリングは行いません。その役割は、既存のドライバーの上位レイヤーとして、「何をテストする価値があるか」を決定することにあります。
動作原理
ジャーニーレジストリでは、各ユーザージャーニーとそのエントリシンボル(ルートハンドラーやスケジューラースイープなど)を定義します。proposeモジュールは、PythonのルートデコレータやNext.jsの慣習をインデックスに照らしてスキャンし、新しいリポジトリ用のレジストリ案を作成します。人間が確認するまで「approved」はfalseのままであり、未承認のレジストリが実行される場合は、サイレントに動作せず警告を発します。diffに対して、testgraphは変更された行範囲をそれらを所有するシンボル(シード)にマッピングし、CodeGraphのエッジグラフを逆方向に推移的に辿って、シードに依存するすべてのシンボル(影響セット)を特定します。そして、そのセットにエントリシンボルが含まれるジャーニーをファンイン順にランク付けして報告し、それぞれに到達した最強のエッジパスの信頼度を付与します。信頼度は「パスにおける最小エッジの最大値」として計算されるため、チェーンの信頼性は最も弱いホップに依存しますが、1つの強固なルートがあれば十分とされます。弱いエッジまたは合成エッジのみで到達したジャーニーは、サイレントに信頼されるのではなく手動確認フラグが立てられ、選択肢から除外されることはありません。本ツールは再現率(recall)を最優先しており、変更が実際に影響を与えたジャーニーを誤って除外するよりも、過剰に選択することを優先します。回答を出す前に、整合性ガードが破損または古いCodeGraphインデックスでの実行を拒否します。誤ったグラフは、自信を持って誤った答えを出すためです。
レジストリの解決は、最初に見つかったものが優先されます。まず環境変数のエスケープハッチ、次にリポジトリ内の.testgraph/journeysディレクトリ(推奨場所)、そしてプロジェクトのチェックアウト内にあるパッケージ横のjourneysディレクトリの順に検索します。レジストリはファイル名ではなく、各場所で自己宣言されたターゲットに基づいてマッチングされ、他のプロジェクトからコピーして未編集のままのものは拒否されます。
前提条件とインストール
標準ライブラリのみを使用したPython 3.11以降(サードパーティ依存関係なし)、diff入力用のgit、およびcodegraph initによって生成されたCodeGraphインデックスを持つターゲットリポジトリが必要です。PyPIからpip install testgraphでインストールできます。wheelにはパッケージのみが含まれ、計測ハーネスとドッグフード用レジストリはリポジトリ内に存在します。
CLIおよびMCP
コマンドラインのエントリポイントには、CIゲートや他のエージェント向けに人間が読める形式またはJSON形式で出力するselect、エージェントがプリコミットで読み取る静的なジャーニーマップを書き出すexport、propose、record、およびサマリーモードがあります。MCP stdioサーバーは、testgraph_impactとtestgraph_journeysの2つのツールを公開し、リポジトリごとに登録されます。これは標準ライブラリのみで構成され、解析モジュールを遅延インポートするため、アイドル状態のサーバーはsqlite3をロードせず、データベース接続も保持せず、インデックスをメモリに保持しません。READMEによると、フルハンドシェイク後のRSSは15.2 MBであり、一般的なPython MCP SDKサーバーの62〜69 MBと比較して軽量です。
配線とレジャー
hooks/install.shは、承認済みレジストリを持つすべてのリポジトリにpre-pushフックをインストールし、プッシュのたびに壊れた可能性のあるジャーニーを表示します。フックは最初にcodegraph syncを実行します。シードは行範囲から得られるため、コード移動前に構築されたインデックスでは、古いスパンに対してdiffを解決してしまうからです。変更されたファイルのバイト数がインデックスされたコピーと依然として一致しない場合、回答の精度が低下し、そのファイル名が明記されます。フックがプッシュを失敗させることはなく、すべてのパスで終了コード0を返します。また、git config設定でリポジトリごとに無効化するか、uninstallフラグで削除できます。実行ごとにJSONLレジャーに選択行が1つ追加されます。recordコマンドは、ジャーニーの実行結果というもう一方の半分を書き込みます。これらをリポジトリとコミットで結合することで、選択されなかったにもかかわらず失敗したジャーニー(サイレントな過小選択)をカウントできます。
ステータス
本ツールは、信頼度重み付きパスを備えたフェーズ1のスパイクとして説明されており、1つのドッグフードターゲットで動作と検証が行われています。手動ラベル付けされた5つのコミットで再現率1.00(平均適合率0.68)、独立したASTオラクルに対してスコア付けされた20のシード変異箇所で再現率1.00を記録し、整合性ガードのテストとスキーマの固定が完了しています。スコープはこの単一ターゲットであり、バックエンドのエントリポイントに登録されたジャーニーを用いて、バックエンドおよびフロントエンドのファイルを分析しています。また、READMEには、レジストリのない2つのリポジトリでの後の計測により、以前の削減主張が覆ったことが記録されています。23のジャーニーを持つあるリポジトリでは、38コミットで0件、2コミットで23件というヒストグラムになり、207のジャーニーを持つ別のリポジトリでは、登録されたサーフェスに触れないコミットを除外すると、ジャーニー実行の回避率は54.1%にとどまりました。したがって、選択数は削減の約束ではなく、結合度の下限として読み取るべきです。同様の計測によりランキングの正しさは確認されており、信頼度0.3で全レジストリ選択となった偽陽性は手動確認フラグが立てられ、一方で正真正銘の広範囲な影響(blast radius)は信頼度0.9でクリーンに検出されました。
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.