momentic-result-classification について
Momentic の E2E テスト実行で発生した失敗を調査し、分類するスキルです。最初に異常が起きた状態を特定し、スクリーンショット、トレース、ステップ結果を根拠に原因を示します。
主な機能
- 01最初に分岐したステップまで追跡
- 02スクリーンショット、トレース、結果を確認
- 03現在と過去の実行を比較
- 04ロケーターとキャッシュの問題を特定
- 05最終的な分類結果を記録
活用シーン
- 01ブラウザーテストの失敗原因を診断
- 02アプリの問題とテストの問題を区別
- 03リトライ後や反復ステップの失敗を調査
MCP 対応
Momentic MCP ツールで実行メタデータ、ステップ結果、テスト手順、実行履歴を取得し、失敗の分類結果を送信します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ momentic-ai/ skills --skill momentic-result-classificationインストール後、Claude Code で/momentic-result-classificationを入力して読み込まれたか確認します。
詳細
Momentic の結果分類(MCP)
Momentic は、各テストがブラウザー操作のステップで構成される、エンドツーエンドテストフレームワークです。各ステップでは、Momentic 固有の動作(AI チェック、自然言語ロケーター、AI アクションなど)と、YAML ステップスキーマでラップされた Playwright の機能を組み合わせます。これらのテストを実行すると、テストの結果を分析するために使用できる結果データが生成されます。結果データには、実行に関するメタデータと、実行によって生成されたアセット(スクリーンショット、ログ、ネットワークリクエスト、動画録画など)が含まれます。あなたの役割は、これらのテスト結果を使用して、Momentic のテスト実行で発生した失敗を分類することです。
手順
- 失敗したテスト実行について、現在の実行が不正な状態に入った最初の時点を特定してください。最後に失敗したアサーションや、見つからなかったロケーターの対象で止めないでください。
- アクション/状態レベルで根本原因を説明してください。どのステップが何をしようとしたのか、どの具体的な要素や状態を前提としていたのか、実際には何が起きたのか、そしてそれを証明する根拠を示してください。
- 以下のカテゴリのいずれかに失敗を分類し、該当するカテゴリを選んだ理由を説明してください。
便利な MCP ツール
momentic_get_run — 実行に関するメタデータと、実行結果全体の概要を返します。メタデータを使って、実行結果を解析してください(例:確認する試行、失敗したステップなど)。現在の実行の詳細が最初のコンテキストですでに提供されている場合、別の試行が明示的に必要でない限り、同じ実行に対して再度呼び出さないでください。
momentic_list_runs — テストの最近の実行を返します。これを使って、過去の実行結果と比較できます。対象の実行に gitBranchName がある場合は、同じバージョンのテストを確認できる可能性が高くなるため、必ず gitBranchName を渡してください。他のブランチの実行を調べる必要がある場合は省略してください。復旧した実行を調べる場合は recovered=true を渡してください。
momentic_get_step_result — 特定のステップの結果を、完全なステップトレースや実行前後のスクリーンショットなどの情報とともに返します。他のステップ内にネストされたステップには parentStepIdChain を使用してください。非常に大きくなる可能性があるため、必要な場合にのみ includeTrace=true を指定してください。
momentic_get_test_steps_for_run — 実行に記録された簡略化済みのテストステップ(stepsSnapshot、beforeStepsSnapshot、afterStepsSnapshot)を返します。テスト名と説明から把握できる以上の情報が必要な場合に、テストの意図を理解するために使用できます。
momentic_submit_result_classification — 実行の分類結果を保存します。調査を完了し、最終的な分類を記録する準備ができた後にのみ呼び出してください。runId と、以下の「正式な分類出力」セクションで説明されているフィールドを渡してください。
調査ワークフロー
履歴に頼る前に、まず現在の実行を調べます。
momentic_get_runを呼び出し、失敗した試行、セクション(beforeSteps、メインステップ、afterStepsのいずれか)、失敗したステップ、およびparentStepIdChainがあればその内容を特定します。- 失敗したステップの結果を、スクリーンショットとトレースとともに取得します。ステップがネストされている場合は、最も近い親コンテナーまたはモジュールの結果も取得します。
- そのステップの実行前スクリーンショットが、そのアクションに対する正しい基準状態かどうかを判断します。すでに正しくない場合は、現在の実行をさかのぼり、その不正な状態を生み出したステップまたはコンテナーを見つけます。
- モジュールやワークフローが繰り返される場合は、過去の実行と比較する前に、同じ現在の実行内で呼び出しを比較します。後の失敗は、多くの場合、それ以前に成功、復旧、または無効な事後条件を残した呼び出しが原因です。
- 子ステップが失敗または復旧している成功コンテナーは、コンテナーの最後の実行後スクリーンショットと URL を確認するまで、部分的な失敗として扱います。
- 現在の実行での挙動を理解してから、特定の比較のために過去の実行を使用します。
分類する前に、以下の質問に答えられるようにします。
- テストで意図されている動作は何ですか?
- 最初に逸脱したステップまたはコンテナーはどれですか?
- そのステップは何をするつもりでしたか?
- 実際にはどの要素または状態を操作、あるいは確認しましたか?
- ステップの後に、スクリーンショット、URL、DOM、トレース、または復旧ログで何が変わりましたか?
- なぜ後の失敗は、その先行する逸脱の結果なのですか?
「セットアップが不安定だった」「ページの状態が正しくなかった」といった曖昧な根本原因は避けます。壊れた事後条件を具体的に記述します。たとえば、「行単位のプラスボタンをクリックしたが、アプリは親ページにとどまり、子ページの編集画面を開かなかった。続くグローバルな Add to アサーションは無関係なページ上のテキストに対して成功したため、対象を指定しない入力ステップで子ページのタイトルが入力されることはなかった」のように記述します。
証拠の基準
- ページの状態を判断する際は、スクリーンショットを基本の情報源とします。スクリーンショットが変化した理由、または変化しなかった理由を説明するために、トレースのフィールドと DOM/HTML を使用します。
- 因果関係に関する主張はすべて検証します。該当する実行前/実行後のスクリーンショット、URL、または DOM による証拠がない限り、オーバーレイ、サイドピーク、モーダル、メニューが存在したとは述べません。
- 「現在、対象が見つからない」ことと、「対象が存在するはずの状態にブラウザーがある」ことを区別します。対象が見つからないのは、多くの場合、先行するアクションが失敗した結果です。
- クリック/入力/アクションのステップでは、意図した操作、実際に操作した要素(確認できる場合)、実行前後の URL、期待される UI 状態が現れたかどうかを記録します。
- アサーションについては、意図した状態を証明できるほど対象が絞られているかを確認します。ページ全体を対象とする広範なコンテンツアサーションは、無関係なテキストに対して成功することがあります。
- 復旧については、失敗した子ステップと、復旧後のコンテナーの最終状態の両方を調べます。復旧によってアサーションの再試行は成功しても、後続のステップが想定していない状態が残ることがあります。
背景
テスト実行結果の構造
CLI 経由で momentic のテストを実行すると、結果は「実行グループ」に保存されます。この実行グループのデータは、momentic プロジェクト内の単一のディレクトリに保存されます。デフォルトのディレクトリ名は test-results ですが、momentic プロジェクトの設定または実行グループの単一の実行時に変更できます。実行グループの結果フォルダーは、次の構造になっています。
test-results/
├── metadata.json data about the run group, including git metadata and timing info.
└── runs/ On zip for each test run in the run group.
├── <runId_1>.zip a zipped run directory containing data about this specific test run. Follows the structure described below.
└── <runId_2>.zip
解凍すると、実行ディレクトリは次の構造になっています。
<runId>/
├── metadata.json run-level metadata.
└── attempts/<n>/ one folder per attempt (1-based n).
├── metadata.json attempt outcome and step results.
├── console.json optional browser console output.
└── assets/
├── <snapshotId>.jpeg before/after screenshot for each step (see attempt metadata.json for snapshot ID).
├── <snapshotId>.html before/after DOM snapshot for each step (see attempt metadata.json for snapshot ID).
├── har-pages.log HAR pages (ndjson).
├── har-entries.log HAR network entries (ndjson).
├── resource-usage.ndjson CPU/memory samples taken during the attempt.
├── <videoName> video recording (when video recording is enabled).
└── browser-crash.zip browser crash dump (only present on crash).
momentic MCP 経由で実行結果を取得すると、momentic_get_run などのツールは MCP の作業ディレクトリへのリンクを返します(デフォルトは .momentic-mcp)。このディレクトリには、上記の構造に従って解凍された実行結果フォルダーが格納されます。フォルダー名は run-result-<runId> です。
要素ロケーター
要素を操作する特定のステップタイプには、「ターゲット」プロパティ、つまりロケーターがあり、ステップが操作する要素を指定します。
ロケーターキャッシュ
ロケーターは、ページの状態を表す HTML/XML とスクリーンショットを LLM に送信することで要素を特定します。LLM は、ページ上でユーザーが指している要素を特定します。Momentic は、今後の実行で AI の呼び出しが不要になるよう、LLM の回答を「キャッシュ」しようとします。次回以降の実行では、ページの状態をキャッシュ済みの要素と照合して、その要素が引き続き使用可能か、またはページが十分に変更されていて別の AI 呼び出しが必要かを判断します。
ロケーターキャッシュは、さまざまな理由で無効になることがあります。
- 要素の説明が変更された場合。この場合、キャッシュは常に無効になります。
- 現在のページの状態でキャッシュ済みの要素を見つけられなかった場合。
- ページの状態でキャッシュ済みの要素が見つかったものの、特定の位置、形状、コンテンツを必須とするなど、キャッシュエントリーに指定されたチェックに失敗した場合。
特定のステップの結果にある trace プロパティで cacheBustReason を確認できます。ただし、includeTrace=true を明示的に指定した場合に限ります。また、結果には cache プロパティも記載されており、その要素に保存されたキャッシュ全体を確認できます。
不適切なキャッシュの特定
キャッシュされた要素が、ユーザーが意図した対象と異なることがあります。これにより、テストが失敗したり、予期しない動作が発生したりする可能性があります。このような場合は、なぜ誤ったキャッシュが最初に保存されたのかを正確に確認すると役立ちます。includeTrace=true は、これらのキャッシュのデバッグ時、または Momentic の実行データに誤りがあると疑われる場合にのみ指定してください。誤ったキャッシュの targetUpdateLoggerTags にある runId プロパティを使って、momentic_get_run をこの runId で呼び出し、元の実行の詳細を取得します。これにより、キャッシュ対象が更新された実行が返されます。
モジュールキャッシュ
モジュールのキャッシュキーと解決済みの入力に変更がない場合、キャッシュ済みのモジュールはステップの実行を省略し、モジュールの最後のステップからキャッシュされた戻り値を再利用します。
認証モジュールでは、モジュールキャッシュからブラウザーの認証状態(Cookie、localStorage、IndexedDB を含む)を保存および復元することもできます。認証状態の復元後、ページコンテンツを確認してキャッシュが引き続き有効かどうかを判断する場合があります。
ファイルのアップロード
ファイルアップロードのステップでは、次に開くネイティブのファイル選択ダイアログに渡すファイルを 1 つ準備するため、ダイアログを開くアクションより前に実行する必要があります。
ファイルのソースには、リモート URL、以前にダウンロードしたファイルへの file:// 参照、CLI のローカルパス、またはアップロードされたユーザーファイルを指定できます。このステップでは、表示されるファイル名を変更することもでき、Momentic は準備したファイルをブラウザーのファイル選択処理に連携します。
過去の実行を利用する
過去の実行は比較の根拠であり、現在の実行を再構成する代わりにはなりません。現在の実行だけでは次の点がわからない場合に利用してください。
- このテストが失敗し始めたのはいつですか?
- 前回の成功時と比べて、何が違いましたか?
- 以前の実行では、同じアクションの動作が異なっていましたか?
- テストの弱点、アプリケーションの変更、実際のアプリケーションのバグ、一時的な遅延のどれに該当しますか?
これらの質問に答えるには、過去の実行のステップ結果とスクリーンショットを確認してください。テスト実行で何が起きたかを把握するために、momentic_get_run または momentic_list_runs の概要だけに頼らないでください。過去の実行を根拠として示す前に、ステップ結果やスクリーンショットを含む実行の詳細を確認してください。
過去の実行を確認する際は、次のワークフローを使用してください。
momentic_list_runsツールを呼び出し、詳細を確認する実行を特定します。対象の実行にgitBranchNameがある場合は、必ず渡してください。他のブランチの実行が必要な場合は省略してください。- 対象の実行に対して
momentic_get_runを呼び出し、実行の詳細を取得します。 - 比較対象と同じステップ/コンテナ、または最も近い同等のものに対して
momentic_get_step_resultを呼び出します。特にスクリーンショットを確認してください。
現在の実行ですでに根本原因が明らかになっていて、過去の実行が関係ない場合は、過去の実行を無理に根拠として持ち出さず、その旨を簡潔に伝えてください。
複数回の試行を伴う実行
momentic_list_runs で attempts > 1 の成功した実行が表示された場合は、問題のない成功ではなく、調査すべき部分的な失敗として扱ってください。attemptNumber パラメーターを使って、その実行で先に失敗した試行の結果を取得し、再試行が成功する前に何が起きていたのかを確認してください。
不安定なテストと断続的な失敗
- テストを不安定、または断続的に失敗しているとみなすには、同じアプリと同じテスト動作で断続的に失敗している必要があります。
- テストが一度失敗しただけで、不安定とは限りません。アプリケーションの変更が原因で失敗した可能性もあります。
- スクリーンショットやその他の実行データを分析し、実行間にアプリケーションまたはテストに変更があったかどうかを判断してください。
- アプリケーションまたはテストの変更が失敗の原因かどうかを確認せずに、不安定さや断続的な失敗について推測してはいけません。
テストの時期
- 過去の結果が、今日のテストファイルと一致するとは限りません。テストが変更され、別のバージョンのテストが実行されていた可能性があります。
get_test_steps_for_runを呼び出すと、実行間にテスト自体が変更されたかどうかを確認するのに役立ちます。ただし、このツールが返すのは各テストステップの 概要 です。テスト実行間に特定のステップの詳細が変更されたと思われる場合は、詳細なステップ情報がmomentic_get_step_resultのレスポンスに含まれています。それらのフィールドとスクリーンショットでも不十分な場合に限り、includeTrace=trueを指定してください。
注意すべき一般的な失敗パターン
- セットアップモジュールが成功したように見えても、誤ったページ、オーバーレイ、フィルター、検索、選択中の行、またはサイドピークを開いたままにしていることがあります。次に失敗したステップだけでなく、不適切な事後条件を残したステップまたはコンテナーに基づいて分類してください。
- クリックは成功と報告され、意図した要素を対象にしていても、アプリケーションが意図した状態に遷移しないことがあります。事後状態を確認し、ロケーターが正しかったという理由だけでクリックが成功したと決めつけないでください。
- 「ページに X が含まれる」のような弱いグローバルアサーションは、ページ内の無関係なテキストに一致して成功することがあります。その結果、次のステップで誤ったコンテキストに入力したり、クリックしたりする可能性があります。
- 対象を明示しない入力ステップは、直前の操作で意図したフィールドにフォーカスできなかった場合、実質的に役立つ場所には何も入力しないことがあります。
- ロケーターやキャッシュは技術的には有効でも、意味的には誤っている場合があります。操作した要素を確認し、キャッシュに問題がある場合は、
targetUpdateLoggerTags.runIdにある元のキャッシュ更新実行を調べてください。 - リカバリーされたステップは、最初の失敗を隠すことがあります。リカバリーされたモジュール内の失敗した子ステップを確認し、リカバリー後の最終状態を次のステップが想定する基準状態と比較してください。
- タイムアウトだからといって、ただちに
INFRAと判断してはいけません。まず、データ不足、ページ状態の誤り、アプリのフロー変更、不適切なロケーターまたはアサーション、セットアップの失敗を除外してください。
関連する問題と無関係な問題の特定
- テストが何を検証しようとしているかを判断するには、テスト名、説明、必要に応じて
momentic_get_test_steps_for_runが返す簡略化されたテストステップを使用してください。 - その意図から外れた失敗は無関係です。それ以外は関連するものとして扱ってください。
- セットアップ(
beforeStepsまたはbeforeResults)やティアダウン(afterStepsまたはafterResults)での失敗は、ほぼ常に無関係とみなされます。 - 関連か無関係かの区別が適用されるのは、バグと変更だけです。たとえば、
INFRAの失敗は、セットアップ内かメインセクション内かにかかわらず、引き続きINFRAです。
バグと変更の違い
- バグ:本来起きるべきでないことが明らかに起きている状態です。たとえば、エラーメッセージが表示されることなどです。1、2 個のステップを見るだけで、バグだと明白に分かります。
- 変更:スクリーンショットによって証明できる、アプリケーションの動作の明確な変更です。
回復可能性
カテゴリーに加えて、回復可能性の値を1つ決定します。
RECOVERABLE— テスト自体を更新することで失敗を自動的に修正でき、以降の実行が成功する場合です。- 例:アプリケーションの変更に合わせてテストの更新が必要な場合、安定して成功するように曖昧なロケーターやアサーションを書き換えられる場合。
ONE_TIME_RECOVERABLE— テストの変更を永続化せず、この実行に限って失敗から回復できる場合です。- 例:テストの目的に影響せず閉じられるランダムなモーダル、一時的な遅延で、待機や再試行により成功する可能性が高い場合。
NON_RECOVERABLE— 失敗を自動的に解決できず、手動での対応が必要な場合です。- 例:認証情報の不足、アップロードに必要なローカルファイルの不足、テストの手順では問題を解決できない、サードパーティーシステムが原因と考えられる障害。
分類結果の形式
- カテゴリー ID は必ず1つだけにしてください。新しいラベルや複数ラベルは使わないでください。
- 判断の根拠はデータに基づけてください。カテゴリーを割り当てる前に、実行内容を十分に調査してください。
- ステップ/モジュールを一般的な名前で特定できる場合は、UUID よりも人が読みやすい参照を優先してください:
module create-subpage-under-parent-page、the last invocation of module <name>、substep 4 (0-indexed)、the failed setup assertionなど。ツール呼び出しには正確な ID が必要ですが、最終的な説明は読みやすくしてください。 - 最終出力で過去の実行に言及する場合は、UUID のみではなく、クリック可能な Momentic URL を使用してください:
https://app.momentic.ai/runs/<runId>。これらの URL 内の UUID は短縮しないでください。 - 説明には、最終的に失敗したステップだけでなく、最初に差異が生じたステップまたはコンテナーと、それによって発生した破損後条件を含めてください。
Reasoning: <a few sentences tied to the earliest divergence, screenshots/traces, past runs if used, and test intent>
Category: <one id from the list>
Recoverable: <RECOVERABLE | ONE_TIME_RECOVERABLE | NON_RECOVERABLE>
Confidence: <high | medium | low>
信頼度レベル:
high— ラベルの変更やクラッシュが明確に分かるスクリーンショットなど、直接的な証拠があるmedium— 複数のシグナルから強く推測できるものの、決定的なスクリーンショットやデータポイントが1つもないlow— 証拠が曖昧で、分類に大幅な推論が必要、または根本原因が不明
カテゴリ ID
次の文字列をそのまま使用してください。
NO_FAILURE— 実行中に失敗はありませんでした。すべての試行に成功しました。APPLICATION_CHANGE— アプリケーションのフローまたは UI が変更されたため、テストが古くなっています。新しい動作に合わせてテストを更新すれば、失敗は恒久的に解消されます。BUG— エラーメッセージが表示されたり、期待されるコンテンツが描画されなかったりするなど、アプリケーションで明らかな問題が発生しました。TEST_AUTHORSHIP— 元の意図を引き続き検証しながら、失敗を防ぐためにテストを恒久的に更新できます。また、ステップの追加や変更、曖昧なアサーションの書き直し、ロケーターの説明の具体化など、具体的な作成上の変更を提案できます。具体的な変更を挙げられない場合は、別のカテゴリを選んでください。タイムアウト、ページの読み込みの遅さ、および推奨される修正が「もっと長く待つ」ことやタイムアウトの延長である失敗は、テストを技術的には編集して長く待つようにできる場合でも、作成上の問題ではありません。これらはINFRAです。- 例:待機やタイムアウト以外のステップを追加または変更して修正できる競合状態(たとえば、「Enter キーを押して入力する」ステップを、明示的に「リストから選択する」ステップに置き換えて、テストとアプリケーションの競合を避ける)、具体的に書き直せる曖昧なアサーションやロケーターの説明。
TEST_SETUP— テストの実行に必要なテストデータまたはファイルが不足しており、修正にはテスト自体の外部でユーザーによる操作が必要です。- 例:ファイルアップロードのステップで必要なファイルがない、テストに必要な認証情報が不足している、または正しくない。
INFRA— 失敗はアプリケーションまたはアプリケーションコードとは無関係で、インフラの停止、読み込みの遅さ、その他の外部要因が原因でした。- 例:ブラウザーのクラッシュ、高いリソース使用率、レート制限、ページまたはアプリケーションが遅いながらも最終的に到達する状態になるのを待つステップやアサーションのタイムアウト。
MOMENTIC_ISSUE— テストの実行中に問題が発生したか、Momentic のデータが正しくありませんでした(例:キャッシュの誤り、グローバルロケーターのリダイレクトで予期しない動作が発生、AI の幻覚)。- 例:実行トレースの表示中に予期しない動作が発生した、スクリーンショット内の明確なデータを AI が明らかに誤読または幻覚し、AI のステップを避ける妥当なテスト方法がない。
OTHER— 失敗が他のどのカテゴリにも当てはまりません。