14
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

きっかけ

Claude Codeのドキュメントで、
「Claudeをunixスタイルのユーティリティとして使用する」 をみた時に
「VRTってもろもろのコスト高いからClaude Codeである程度サクッとできたら良さそうなのでは?」
と思いました。
今回は画像比較の部分にフォーカスしてみてみます。
おそらくすでに検証などやっている方はいると思いますが、自分でも試してみようと思いました。

やり方

  • .claude/vrt-conditions.md を作成
  • diffディレクトリをどこでもいいので作成
  • diffディレクトリの中にafter.png before.pngなどで画像配置
  • claude codeにスクリプトを投げる

モデルはSonnet4.5です。

vrt-conditions.md
# Visual Regression Test (VRT) 比較条件定義

このドキュメントは、**既に出力済みの before / after 画像を比較するときの判定基準**を定義する。

Claude / ClaudeCode による自動レビュー、および人間による目視確認の両方で共通のルールとして利用する。

---

## 1. 前提・入力

- 対象:
    - Web アプリ / サービスの UI スクリーンショット
    - 同じ画面・同じパス・同じ viewport サイズで取得された「before / after」ペア
- 入力情報:
    - `before` 画像
    - `after` 画像
    - (あれば)ピクセル差分ツールの結果
        - 差分ハイライト画像 (diff.png)
        - JSON 形式のメトリクス例:
            - `width`, `height`
            - `diffPixels`(差分ピクセル数)
            - `diffRatio`(全体に対する差分割合 0〜1)
            - `threshold`(比較に使ったしきい値)

---

## 2. 判定の基本方針

1. **レイアウト崩れ・要素の消失 / 重なり** を最優先で検出する。
2. 仕様に基づく意図的な UI 変更は **OK** とし、それ以外の予期しない変化を **NG** とする。
3. 完全一致を求めるのではなく、以下の「許容される微差」を前提とする。
4. 差分はすべて **「どの要素が」「どう変わったか」「ユーザー影響」** の 3 点セットで説明する。

---

## 3. 必ず一致させたい項目(厳格チェック対象)

以下の要素については、**明示的な仕様変更がない限り、before / after で一致しているべき**とする。

1. **コンポーネント構造**
    - ヘッダー・フッター・サイドバー・メインコンテンツなどの大枠の構造
    - 重要なボタン・リンク・フォーム部品の有無
    - 重要なラベル(ページタイトル・セクションタイトル)

2. **要素の位置とサイズ(レイアウト)**
    - 主要コンポーネントの位置ズレが **±2px を超える場合は差分候補** とする
    - 要素同士の間隔(余白)が極端に変わっている場合(例: マージンが半分以下/2倍以上)

3. **文字列内容**
    - 固定文言(例: 「ログイン」「保存」「キャンセル」など)は完全一致とする
    - メニュー項目名、ボタンラベル、フォームラベルは原則として変更されない前提

4. **ブランドに関わる見た目**
    - ロゴ画像・コーポレートカラー・メインボタンの色
    - 重要なブランド要素(背景イラストなど)

---

## 4. 許容される微妙な差分

以下は「実質的に問題ない差分」として、原則は **OK** と判定する。

1. **アンチエイリアス / フォントレンダリングの微差**
    - 同一テキストで数ピクセル単位のにじみ方・グラデーションの違い
    - OS / ブラウザ差によるフォントのほんのわずかな変化
    - これらはピクセル比較上は差分として検出されるが、UI 品質としては許容する。

2. **1〜2px 程度の位置ズレ**
    - スクロールバーやスクロール位置の微差
    - アイコン・テキストの 1px レベルの揺れ
    - ただし、一貫して配置が崩れて見える場合(例: カードが全体的に下にずれている)は要確認。

3. **数値・日付・時刻などの動的値**
    - 現在日時
    - アクセス数・PV・いいね数などのライブカウンタ
    - ランダム表示される推薦コンテンツ など  
      → これらはコンテンツが変わっても **レイアウトが保たれていれば OK** とする。

---

## 5. 完全に無視してよい領域・要素

比較時に **差分対象外** として扱う領域(無視領域)の例:

1. **広告枠(Ad, Sponsor)**
    - 広告バナー、外部配信コンテンツ
2. **ユーザー固有情報**
    - ユーザー名、アバター画像、メールアドレスなど
3. **セッション依存の要素**
    - トースト通知
    - 一時的なモーダル(例: 「保存しました」)
4. **A/B テスト用のバリエーションエリア**
    - 明示的に「AB テスト中」とされているコンテンツ枠

実装上は、これらの領域について

- 事前にマスク用の矩形(x, y, width, height)
- あるいは CSS セレクタ

で指定し、ピクセル比較から除外することを推奨する。

---

## 6. 差分の重要度ランク

差分は以下の 4 段階で分類する。

### 6.1 BLOCKER(致命的)

- ユーザーが操作できない / 情報が見えない状態になる変化
    - ボタンが消えている、リンクが押せない、テキストが背景と同色で読めない
- 主要コンテンツが画面外に押し出されている
- モーダルやオーバーレイが常に表示されていて操作を妨げている

**対応:** リリース前に必ず修正。

---

### 6.2 MAJOR(重要)

- レイアウトの崩れが目立ち、ユーザー体験に悪影響を与える
    - 文字がはみ出す、カードが重なって読めない
    - PC/モバイルで明らかに崩れているブロック
- 意図しない色変更により、ボタンだと認識しづらくなった など

**対応:** 早期に修正。リリース前に可能な限り対応する。

---

### 6.3 MINOR(軽微)

- 余白・位置・フォントサイズに少し違和感が出る程度
- スマホ表示で 1 行だったものが 2 行に折り返されているが、可読性は保たれている

**対応:** 余裕があれば修正。リリースは許容。

---

### 6.4 NIT(好みレベル)

- 余白のバランス・アイコンの線の太さなど、デザイン上の好みレベルの差
- 明確な仕様がなく、ほぼ問題のない微差

**対応:** デザインレビューのタイミングで検討。

---

## 7. Claude / ClaudeCode が行うチェック手順

Claude / ClaudeCode で画像を比較させる場合は、次の流れで評価する。

1. **画面種別の特定**
    - before / after の画面が同じページであることを確認する  
      (URL・パンくず・ページタイトルなどから)

2. **大枠レイアウトの比較**
    - ヘッダー / フッター / サイドバーの有無・位置
    - メインコンテンツの構造(セクションの順序・カードの並び)

3. **重要コンポーネントの比較**
    - 主ボタン・フォーム・テーブル・カードなど、業務に重要な要素の有無
    - 要素の位置・重なり・読めるかどうか

4. **テキスト内容の比較**
    - 固定文言が意図せず変わっていないか
    - メニュー・ボタンラベルの変更が spec 上の想定かどうか(分からない場合は「要確認」扱い)

5. **差分メトリクスの参照**
    - `diffRatio` が高い順に重要度をチェック
    - 差分画像(diff.png)を参考に、局所的な差か全体的な崩れかを判定

6. **無視してよい領域の除外**
    - 動的値・広告枠・ユーザー固有情報などを差分として数えない

7. **結果の整理**
    - 差分がある場合、以下の形式で列挙する:

```text
- 対象画面: <ページの名称や URL >
- 差分種別: BLOCKER / MAJOR / MINOR / NIT
- 位置/要素: 例) 「右上のプロフィールメニュー」「中央のカード一覧」
- before → after の変化:
  - before: ...
  - after : ...
- ユーザーへの影響: 例) 「ボタンが見えづらくなり、押し間違いのリスクがある」
- 判定理由: 例) 「必ず一致させたい項目 (3.x) に該当するため」

スクリプト
以下の VRT 比較ルールに従って、before / after の UI 画像を比較してください。

  - md ファイル(vrt-conditions.md)
  - diff/before.png 画像
  - diff/after.png 画像
  - (あれば)diff 画像と JSON メトリクス

  ルールに沿って、
  - 差分がある箇所の洗い出し
  - それぞれの重要度ランク (BLOCKER / MAJOR / MINOR / NIT)
  - 影響範囲と簡単なコメント

  を日本語でまとめてください。

ケース毎で検証...!✨

私が今年作ったサイト、GovTech Bridge で検証していきます!

全く同じ画像の場合

after.png
 
結果...
完全に一致で問題なし

これがダメだったら結構悲しかったのでよかったです笑

ボタンの色が違う場合

【変更前】
before.png

【変更後】
after.png

結果...
期待通り検出できました!!

レポート内容
⏺ VRT比較結果レポート

  VRT比較ルール(vrt-conditions.md)に基づき、before/after画像を分析しました。

  ---
  📊 総合判定

  ⚠️ 差分検出: 1件(MINOR)

  ---
  🔍 検出された差分

  差分 #1: メインCTAボタンの色変更

  重要度ランク: MINOR(軽微)

  📍 位置/要素

  - 中央部の主要CTAボタン「GovTech Bridgeとは >」

  🔄 Before → After の変化

  - Before: ダークネイビー(濃紺、ほぼ黒に近い色 #1a2332程度)
  - After: ブルー(明るい青色 #5b8ee6程度)

  👤 ユーザーへの影響

  - 可読性: ボタンのテキスト「GovTech
  Bridgeとは」は白色で、背景が明るくなったことでコントラストがやや下がっているが、依然として読みやすい
  - 視認性: 明るいブルーは目立ちやすく、CTAボタンとして機能する
  - デザイン一貫性: 下部の「民間企業の担当者」ボタンが青〜紫グラデーションであり、色系統が近くなったことで統一
  感が出ている可能性がある

  ⚖️ 判定理由

  - VRTルール 3.4(ブランドに関わる見た目)
  に該当する可能性があるが、ボタン色の変更が仕様変更によるものか確認が必要
  - レイアウト崩れや機能喪失はなく、ボタンは正常に表示されている
  - 色のコントラスト比は十分確保されており、アクセシビリティ上の問題はない

  📝 推奨対応

  - 仕様確認: デザイン仕様書やブランドガイドラインで、このボタンの色が意図的に変更されたものか確認
  - 意図的な変更の場合: OK(リリース可)
  - 意図しない変更の場合: ダークネイビーに戻す修正を検討

  ---
  ✅ 一致している要素

  以下の要素については差分なし:

  1. レイアウト構造: ヘッダー、コンテンツ、CTAセクションの配置
  2. ロゴ: 位置、サイズ、色(紫色)
  3. タイトル: "GovTech Bridge とは"(フォント、位置)
  4. 説明文: 3行のテキストブロック(内容、配置、行間)
  5. 矢印アイコン: ボタン内の「>」記号
  6. セクション区切り線: グレーの水平線
  7. 会員登録見出し: "会員登録はこちらから"
  8. 下部CTAボタン(左): "行政ご担当者・CIO補佐官の方 >" ピンク〜紫グラデーション
  9. 下部CTAボタン(右): "民間企業の担当者 >" 青〜紫グラデーション

  ---
  📈 詳細分析

  大枠レイアウト

  - ✅ ヘッダーエリア: 変更なし
  - ✅ メインコンテンツエリア: 変更なし
  - ✅ CTAセクション: 変更なし

  テキスト内容

  - ✅ すべての固定文言が一致
  - ✅ ボタンラベルの変更なし

  コンポーネント構造

  - ✅ すべての要素が表示されている
  - ✅ 要素の消失・重なりなし
  - ✅ 位置ズレなし(±2px以内)

  ---
  🎯 リリース判定

  条件付き承認

  - 色変更が 仕様変更 の場合: ✅ リリース可(問題なし)
  - 色変更が 意図しない変更 の場合: ⚠️ 修正後リリース推奨

  ボタンの機能性、可読性、アクセシビリティには問題がないため、MINOR(軽微)ランクとしています。デザイン仕様を確
  認の上、最終判断をお願いいたします。

文言が違う場合

【変更前】
before.png

【変更後】
after.png

結果...
期待通り検出できました!!

レポート内容
⏺ VRT比較結果レポート

  VRT比較ルール(vrt-conditions.md)に基づき、before/after画像を詳細に分析しました。

  ---
  📊 総合判定

  ⚠️ 差分検出: 2件(MAJOR: 1件、MINOR: 1件)

  ---
  🔍 検出された差分

  差分 #1: 説明文の内容変更

  重要度ランク: MAJOR(重要)

  📍 位置/要素

  - ページ中央部の説明文ブロック(2行目〜3行目)

  🔄 Before → After の変化

  Before(2行目):
  行政DXのキーパーソンとなるCIO補佐官に関する情報や、民間企業が提供するプロダクトやソリューションの紹介、

  After(2行目):
  行政DXのキーパーソンとなるCIO補佐官に関する情報、民間企業が提供するプロダクトの紹介、

  Before(3行目):
  自治体での成功事例、キャッチアップが難しいナレッジやノウハウを幅広く提供し、活発な官民交流からDXを促進します
  。

  After(3行目):
  自治体での成功事例に加え、キャッチアップが難しいナレッジやノウハウを幅広く提供し、活発な官民交流からDXを促進
  する。

  📝 主な変更点

  1. 2行目: 「やソリューション」が削除され、「プロダクト」のみに
  2. 3行目前半: 「成功事例、」→「成功事例に加え、」に変更
  3. 3行目末尾: 「促進します。」→「促進する。」(文末表現の変更)

  👤 ユーザーへの影響

  - 可読性: 変更後もテキストは読みやすく、レイアウト崩れなし
  - 意味の変化: サービス内容の説明が微妙に変化しており、「ソリューション」という表現が削除されている
  - トーン変更: 文末が「です・ます調」から「である調」に変化

  ⚖️ 判定理由

  - VRTルール 3.3(文字列内容) に該当:固定文言の変更
  - コンテンツの意味や訴求内容が変わるため、意図的な変更でない場合は要確認
  - レイアウトは保たれているが、ブランドメッセージに関わる重要なテキスト

  ---
  差分 #2: セクション見出しの表現変更

  重要度ランク: MINOR(軽微)

  📍 位置/要素

  - CTAボタン上部の見出しテキスト

  🔄 Before → After の変化

  - Before: 「会員登録はこちらから」
  - After: 「会員登録はこちら」

  👤 ユーザーへの影響

  - 可読性: 問題なし、意味は変わらない
  - 視認性: やや簡潔になったが、CTAとしての機能は保持
  - UI一貫性: 小さな表現の変更

  ⚖️ 判定理由

  - VRTルール 3.3(文字列内容) に該当:固定文言の軽微な変更
  - 意味は同じで、より簡潔な表現になっている
  - 仕様変更の可能性があり、確認推奨

  ---
  ✅ 一致している要素

  以下の要素については差分なし:

  1. レイアウト構造: すべての要素の配置が保持されている
  2. ロゴ: 位置、サイズ、色(紫色)
  3. タイトル: "GovTech Bridge とは"
  4. 説明文1行目: 完全一致
  5. メインCTAボタン: 「GovTech Bridgeとは >」ボタン(色、位置、サイズ)
  6. セクション区切り線: グレーの水平線
  7. 下部CTAボタン(左): "行政ご担当者・CIO補佐官の方 >" ピンク〜紫グラデーション
  8. 下部CTAボタン(右): "民間企業の担当者 >" 青〜紫グラデーション
  9. 要素の位置: すべての要素で位置ズレなし

  ---
  📈 詳細分析

  1. 画面種別の特定

  - ✅ 同一ページ(GovTech Bridge トップページ)を確認

  2. 大枠レイアウトの比較

  - ✅ ヘッダーエリア: 変更なし
  - ✅ メインコンテンツエリア: 変更なし(テキスト内容のみ変更)
  - ✅ CTAセクション: 変更なし

  3. 重要コンポーネントの比較

  - ✅ すべてのボタンが正常に表示されている
  - ✅ 要素の消失・重なりなし
  - ✅ 位置ズレなし(±2px以内)

  4. テキスト内容の比較

  - ⚠️ 説明文の内容に意図的と思われる変更あり
  - ⚠️ 見出しテキストに軽微な変更あり

  ---
  🎯 リリース判定

  条件付き承認 - 仕様確認必須

  対応推奨事項

  差分 #1(MAJOR)について:

  - ✋ リリース前に確認が必要
  - 以下を確認してください:
    a. 説明文の変更は意図的なコピーライティング修正か?
    b. 「ソリューション」という言葉の削除は仕様上問題ないか?
    c. 文末の「です・ます調」→「である調」への変更は意図的か?

  差分 #2(MINOR)について:

  - 📝 余裕があれば確認推奨
  - 「から」の削除が意図的な簡略化であれば問題なし

  ---
  📋 チェックリスト

  - 説明文の変更が仕様書・デザイン案と一致するか確認
  - コピーライティング担当者にテキスト変更を確認
  - 文体統一方針(です・ます調 vs である調)を確認
  - 上記確認後、問題なければリリース可

  注: レイアウト崩れや機能的な問題はありません。テキスト内容の変更が意図的なものであれば、リリースに支障はあり
  ません。

ボタンが消えた場合

【変更前】
before.png

【変更後】
after.png

結果...
期待通り検出できました!!

レポート内容
⏺ VRT比較結果レポート

  VRT比較ルール(vrt-conditions.md)に基づき、before/after画像を詳細に分析しました。

  ---
  📊 総合判定

  ⚠️ 差分検出: 1件(BLOCKER)

  ---
  🔍 検出された差分

  差分 #1: メインCTAボタンの消失

  重要度ランク: BLOCKER(致命的)

  📍 位置/要素

  - ページ中央部のメインCTAボタン「GovTech Bridgeとは >」

  🔄 Before → After の変化

  - Before: ダークネイビーのボタン「GovTech Bridgeとは >」が説明文の下に表示されている
  - After: ボタンが完全に消失している

  👤 ユーザーへの影響

  - 機能性: 重要な導線(GovTech Bridgeの詳細ページへのリンク)が失われている
  - ユーザー体験: サービス詳細を知りたいユーザーがアクセスできなくなる
  - コンバージョン: 主要なCTAが消失しているため、ユーザー行動に重大な影響

  ⚖️ 判定理由

  - VRTルール 6.1(BLOCKER) に該当:「ボタンが消えている、リンクが押せない」状態
  - VRTルール 3.1(コンポーネント構造) に違反:重要なボタンの有無
  - ユーザーが操作できない状態になる致命的な変化

  📝 必須対応

  - 🚨 リリース前に必ず修正
  - ボタンの復元が必要
  - CSSまたはHTML上の表示・非表示ロジックを確認

  ---
  ✅ 一致している要素

  以下の要素については差分なし:

  1. ロゴ: 位置、サイズ、色(紫色)
  2. タイトル: "GovTech Bridge とは"(フォント、位置)
  3. 説明文: 3行のテキストブロック(内容、配置、行間)すべて一致
  4. セクション区切り線: グレーの水平線(位置が若干上に移動しているが、これはボタン消失の影響)
  5. 会員登録見出し: "会員登録はこちらから"
  6. 下部CTAボタン(左): "行政ご担当者・CIO補佐官の方 >" ピンク〜紫グラデーション
  7. 下部CTAボタン(右): "民間企業の担当者 >" 青〜紫グラデーション

  ---
  📈 詳細分析

  1. 画面種別の特定

  - ✅ 同一ページ(GovTech Bridge トップページ)を確認

  2. 大枠レイアウトの比較

  - ✅ ヘッダーエリア: 変更なし
  - ⚠️ メインコンテンツエリア: ボタンが消失
  - ✅ CTAセクション: 下部2つのボタンは正常表示

  3. 重要コンポーネントの比較

  - 🚨 メインCTAボタン: 消失(BLOCKER)
  - ✅ 下部CTAボタン: 正常表示
  - ⚠️ レイアウト: ボタン消失により、区切り線が説明文のすぐ下に配置されている

  4. 考えられる原因

  - CSSの display: none または visibility: hidden が適用された
  - 条件分岐により非表示になっている
  - HTMLから要素が削除された
  - レスポンシブデザインのブレークポイントの変更

  ---
  🎯 リリース判定

  🚫 リリース不可 - 即座に修正が必要

  必須対応事項

  BLOCKERレベルの問題:

  - 🚨 メインCTAボタン「GovTech Bridgeとは」の復元が必須
  - 以下を確認・修正してください:
    a. HTMLテンプレート/コンポーネントでボタン要素が削除されていないか
    b. CSS/JavaScriptで非表示にされていないか
    c. 条件分岐ロジックで意図せず非表示になっていないか
    d. レスポンシブデザインの設定が正しいか

  ---
  📋 修正確認チェックリスト

  - ボタンのHTML要素が存在するか確認
  - CSS で display: none や visibility: hidden が適用されていないか確認
  - JavaScript によるDOM操作で削除されていないか確認
  - 条件分岐ロジック(if文など)を確認
  - 修正後、再度VRT比較を実施
  - すべてのviewport(デスクトップ/タブレット/モバイル)で表示確認

  ---
  🔴 結論

  ユーザーが主要な導線を利用できない致命的な問題です。このままリリースすることはできません。ボタンの復元後、再
  度VRTを実施してください。

ボタンの位置が右にずれている

【変更前】
before.png

【変更後】
after.png

結果...
検知できず失敗!!
したので理由を確認しました

理由
⏺ 大変申し訳ございません。私の分析が不十分でした。なぜこの差分を見抜けなかったのか、技
  術的な理由を説明いたします。

  ---
  🔍 差分を見逃した原因分析

  1. 視覚的認識の限界

  私(AI)は画像を全体として認識しますが、ピクセル単位の精密な位置測定を自動的に行って
  いるわけではありません。

  - 人間の目視レビューのように「左右の余白を比較する」という直感的な判断が苦手
  - 32pxという数値は、画面全体の幅(約1400px程度)の約2.3%であり、全体画像を見た際に「
  大きく崩れている」という印象を受けにくかった
  - 両画像でボタン自体が存在し、読めて、クリック可能であることから「機能的には問題ない
  」と誤判断してしまった

  2. 比較手法の問題

  私が行った比較は以下のような手法でした:

  ❌ 実際に行った比較(不十分):
  - 要素の有無を確認(ボタンが存在するか)
  - テキスト内容の一致(ラベルが同じか)
  - 色・サイズの大まかな一致(ボタンの見た目)
  - 全体的なレイアウト構造(セクションの順序)

  ✅ 本来行うべきだった比較:
  - 左右の余白を測定(ボタンの左端から画面左端までの距離、右端から画面右端までの距離)
  - 中央揃えの検証(ボタンの中心座標 vs 画面の中心座標)
  - ピクセル単位での位置座標チェック

  3. VRTルールの解釈ミス

  VRTルール「3.2 要素の位置とサイズ」には以下の記載があります:

  主要コンポーネントの位置ズレが ±2px を超える場合は差分候補 とする

  私はこのルールを認識していましたが、実際にピクセル測定を行わなかったため、ルールを適
  用できませんでした。

  4. 分析プロセスの欠陥

  私の分析プロセスには以下の欠陥がありました:

  ❌ 実際のプロセス:
  1. 全体を見る → 「大きな崩れはない」
  2. 要素をチェック → 「すべて存在する」
  3. テキストをチェック → 「すべて一致」
  4. 結論: 「差分なし」

  ✅ あるべきプロセス:
  1. 全体を見る
  2. 要素をチェック
  3. テキストをチェック
  4. **各要素の位置を定量的に測定** ← これが欠けていた
  5. **左右の余白バランスを確認** ← これが欠けていた
  6. 結論を出す

  ---
  🛠️ 改善策

  今後、同様の見逃しを防ぐために、以下の改善が必要です:

  1. 定量的な測定の実施

  - 重要な要素(CTA
  ボタンなど)については、視覚的確認だけでなく、位置の定量的分析を行う
  - 中央揃え要素については、左右の余白が等しいかを明示的に確認する

  2. チェックリストの厳格化

  - VRTルール「±2px を超える位置ズレ」を機械的にチェックする
  - 特にレイアウトの対称性(中央揃え、均等配置など)を重点的に確認する

  3. 差分検出ツールの活用

  - 本来であれば、ピクセル差分画像(diff.png)や JSON
  メトリクスがあれば、このような差分は数値として明確に検出できた
  - 画像のみでの比較では限界があることを認識すべきだった

  ---
  📊 32px ズレの重大性

  ユーザーが指摘された「32px」のズレは、以下の理由で MAJOR レベルの重大な差分 です:

  1. 視覚的に明確: 画面幅の約2.3%は、人間の目で容易に認識できる
  2. デザイン意図に反する: 中央揃えが意図されているのに、右にズレている
  3. 品質への影響: プロフェッショナルなデザインとして「雑」「未完成」の印象を与える
  4. VRTルール違反: ±2px の許容範囲を大きく超えている(16倍)

  ---
  🙇 総括

  私の分析の問題点:
  - ✅ 要素の存在確認に偏重しすぎた
  - ❌ 位置の定量的測定を怠った
  - ❌ 左右の余白バランスを確認しなかった
  - ❌ VRTルールの「±2px」を実際に検証しなかった

  ご指摘いただいた差分は、視覚的に明確で、VRTルールに基づいても MAJOR 
  レベルの重要な問題でした。これを見逃したことは、分析プロセスの重大な欠陥です。

  今後は、特に中央揃えやレイアウトの対称性について、より厳密な定量的チェックを実施いた
  します。

  貴重なフィードバックをありがとうございました。

この理由を活かして、mdファイルに追記してもらいました。

vrt-conditions.md
# Visual Regression Test (VRT) 比較条件定義

このドキュメントは、**既に出力済みの before / after 画像を比較するときの判定基準**を定義する。

Claude / ClaudeCode による自動レビュー、および人間による目視確認の両方で共通のルールとして利用する。

---

## 1. 前提・入力

- 対象:
    - Web アプリ / サービスの UI スクリーンショット
    - 同じ画面・同じパス・同じ viewport サイズで取得された「before / after」ペア
- 入力情報:
    - `before` 画像
    - `after` 画像
    - (あれば)ピクセル差分ツールの結果
        - 差分ハイライト画像 (diff.png)
        - JSON 形式のメトリクス例:
            - `width`, `height`
            - `diffPixels`(差分ピクセル数)
            - `diffRatio`(全体に対する差分割合 0〜1)
            - `threshold`(比較に使ったしきい値)

---

## 2. 判定の基本方針

1. **レイアウト崩れ・要素の消失 / 重なり** を最優先で検出する。
2. 仕様に基づく意図的な UI 変更は **OK** とし、それ以外の予期しない変化を **NG** とする。
3. 完全一致を求めるのではなく、以下の「許容される微差」を前提とする。
4. 差分はすべて **「どの要素が」「どう変わったか」「ユーザー影響」** の 3 点セットで説明する。

---

## 3. 必ず一致させたい項目(厳格チェック対象)

以下の要素については、**明示的な仕様変更がない限り、before / after で一致しているべき**とする。

1. **コンポーネント構造**
    - ヘッダー・フッター・サイドバー・メインコンテンツなどの大枠の構造
    - 重要なボタン・リンク・フォーム部品の有無
    - 重要なラベル(ページタイトル・セクションタイトル)

2. **要素の位置とサイズ(レイアウト)**
    - 主要コンポーネントの位置ズレが **±2px を超える場合は差分候補** とする
    - 要素同士の間隔(余白)が極端に変わっている場合(例: マージンが半分以下/2倍以上)

3. **文字列内容**
    - 固定文言(例: 「ログイン」「保存」「キャンセル」など)は完全一致とする
    - メニュー項目名、ボタンラベル、フォームラベルは原則として変更されない前提

4. **ブランドに関わる見た目**
    - ロゴ画像・コーポレートカラー・メインボタンの色
    - 重要なブランド要素(背景イラストなど)

---

## 4. 許容される微妙な差分

以下は「実質的に問題ない差分」として、原則は **OK** と判定する。

1. **アンチエイリアス / フォントレンダリングの微差**
    - 同一テキストで数ピクセル単位のにじみ方・グラデーションの違い
    - OS / ブラウザ差によるフォントのほんのわずかな変化
    - これらはピクセル比較上は差分として検出されるが、UI 品質としては許容する。

2. **1〜2px 程度の位置ズレ**
    - スクロールバーやスクロール位置の微差
    - アイコン・テキストの 1px レベルの揺れ
    - ただし、一貫して配置が崩れて見える場合(例: カードが全体的に下にずれている)は要確認。

3. **数値・日付・時刻などの動的値**
    - 現在日時
    - アクセス数・PV・いいね数などのライブカウンタ
    - ランダム表示される推薦コンテンツ など  
      → これらはコンテンツが変わっても **レイアウトが保たれていれば OK** とする。

---

## 5. 完全に無視してよい領域・要素

比較時に **差分対象外** として扱う領域(無視領域)の例:

1. **広告枠(Ad, Sponsor)**
    - 広告バナー、外部配信コンテンツ
2. **ユーザー固有情報**
    - ユーザー名、アバター画像、メールアドレスなど
3. **セッション依存の要素**
    - トースト通知
    - 一時的なモーダル(例: 「保存しました」)
4. **A/B テスト用のバリエーションエリア**
    - 明示的に「AB テスト中」とされているコンテンツ枠

実装上は、これらの領域について

- 事前にマスク用の矩形(x, y, width, height)
- あるいは CSS セレクタ

で指定し、ピクセル比較から除外することを推奨する。

---

## 6. 差分の重要度ランク

差分は以下の 4 段階で分類する。

### 6.1 BLOCKER(致命的)

- ユーザーが操作できない / 情報が見えない状態になる変化
    - ボタンが消えている、リンクが押せない、テキストが背景と同色で読めない
- 主要コンテンツが画面外に押し出されている
- モーダルやオーバーレイが常に表示されていて操作を妨げている

**対応:** リリース前に必ず修正。

---

### 6.2 MAJOR(重要)

- レイアウトの崩れが目立ち、ユーザー体験に悪影響を与える
    - 文字がはみ出す、カードが重なって読めない
    - PC/モバイルで明らかに崩れているブロック
    - **中央揃え要素の位置ズレ**: ボタン・モーダル・カードなどが中央から大きくズレている(例: 32px以上)
    - **対称性の崩れ**: 左右対称であるべきレイアウトが非対称になっている
- 意図しない色変更により、ボタンだと認識しづらくなった など

**対応:** 早期に修正。リリース前に可能な限り対応する。

---

### 6.3 MINOR(軽微)

- 余白・位置・フォントサイズに少し違和感が出る程度
- スマホ表示で 1 行だったものが 2 行に折り返されているが、可読性は保たれている

**対応:** 余裕があれば修正。リリースは許容。

---

### 6.4 NIT(好みレベル)

- 余白のバランス・アイコンの線の太さなど、デザイン上の好みレベルの差
- 明確な仕様がなく、ほぼ問題のない微差

**対応:** デザインレビューのタイミングで検討。

---

## 7. Claude / ClaudeCode が行うチェック手順

Claude / ClaudeCode で画像を比較させる場合は、次の流れで評価する。

1. **画面種別の特定**
    - before / after の画面が同じページであることを確認する
      (URL・パンくず・ページタイトルなどから)

2. **大枠レイアウトの比較**
    - ヘッダー / フッター / サイドバーの有無・位置
    - メインコンテンツの構造(セクションの順序・カードの並び)

3. **重要コンポーネントの比較**
    - 主ボタン・フォーム・テーブル・カードなど、業務に重要な要素の有無
    - 要素の位置・重なり・読めるかどうか

4. **テキスト内容の比較**
    - 固定文言が意図せず変わっていないか
    - メニュー・ボタンラベルの変更が spec 上の想定かどうか(分からない場合は「要確認」扱い)

5. **要素の位置を定量的に測定(重要)**
    - **中央揃え要素の検証**: ボタン・カード・モーダルなど中央に配置されるべき要素について、左右の余白が等しいか確認
    - **位置ズレの測定**: 主要コンポーネントの位置が±2pxを超えてズレていないか定量的にチェック
    - **対称性の確認**: デザインの対称性(左右対称、均等配置など)が保たれているか確認
    - ⚠️ **注意**: 要素の有無やテキスト内容の確認だけでは不十分。視覚的に「問題なさそう」に見えても、実際には数十ピクセル単位でズレている可能性がある

6. **差分メトリクスの参照**
    - `diffRatio` が高い順に重要度をチェック
    - 差分画像(diff.png)を参考に、局所的な差か全体的な崩れかを判定

7. **無視してよい領域の除外**
    - 動的値・広告枠・ユーザー固有情報などを差分として数えない

8. **結果の整理**
    - 差分がある場合、以下の形式で列挙する:

```text
- 対象画面: <ページの名称や URL >
- 差分種別: BLOCKER / MAJOR / MINOR / NIT
- 位置/要素: 例) 「右上のプロフィールメニュー」「中央のカード一覧」
- before → after の変化:
  - before: ...
  - after : ...
- ユーザーへの影響: 例) 「ボタンが見えづらくなり、押し間違いのリスクがある」
- 判定理由: 例) 「必ず一致させたい項目 (3.x) に該当するため」
---

## 8. 過去の見逃し事例と教訓

### 事例 #1: 中央揃えボタンの32px位置ズレ(2025-12-14)

#### 状況
- **対象画面**: GovTech Bridge トップページ
- **差分内容**: メインCTAボタン「GovTech Bridgeとは」が中央から右に32pxズレていた
- **重要度**: MAJOR(重要)
- **見逃した理由**:
  - 要素の有無・テキスト内容・色・サイズのみを確認し、位置の定量的測定を怠った
  - 全体を見て「大きく崩れていない」と判断し、詳細な位置チェックをスキップした
  - ±2pxルールを認識していたが、実際に測定を行わなかった

#### 教訓
1. **定量的測定の必須化**: 視覚的確認だけでなく、主要要素の位置を必ず定量的に測定する
2. **中央揃え要素の特別扱い**: ボタン・モーダル・カードなど中央に配置される要素は、左右の余白が等しいか必ず確認
3. **±2pxルールの厳格適用**: ルールを知っているだけでなく、実際に測定して検証する
4. **32pxは視覚的に明確**: 画面幅の2〜3%のズレは人間の目で容易に認識できる重大な差分

#### 改善策
- チェック手順に「5. 要素の位置を定量的に測定」を追加
- MAJOR定義に「中央揃え要素の位置ズレ」を明記
- 対称性・中央揃えを重点チェック項目として認識

セッションをリセットしてリベンジします

結果...
検知できたけど正確では無い...ボタンの幅が小さくなったと認識していますね

レポート内容
⏺ 差分画像やJSONメトリクスファイルは見つかりませんでしたが、before / after 画像を詳細に比較します。

  VRT 比較結果

  対象画面

  GovTech Bridge トップページ(「GovTech Bridgeとは」セクション)

  ---
  検出された差分

  1. 「GovTech Bridgeとは」ボタンの幅の変化

  重要度: MINOR(軽微)

  位置/要素: 中央部のメインCTAボタン

  before → after の変化:
  - before: ボタンの幅が約 420px
  - after: ボタンの幅が約 416px(わずかに狭くなっている)

  ユーザーへの影響:
  - 視覚的にはほとんど認識できないレベルの差
  - ボタンの押しやすさ・可読性に影響なし
  - 中央揃えは維持されている

  判定理由:
  - ピクセル単位でのわずかな幅の差であり、レンダリング環境の違いやアンチエイリアスの影響の可能性がある
  - 4px程度の差は「4. 許容される微妙な差分」の1〜2px程度の基準をわずかに超えるが、ボタンの全体幅に対して1%未満の変化であり、実質的な影響は軽微

  ---
  2. 要素の中央配置の確認結果

  重要度: OK(問題なし)

  検証項目:
  - ロゴとタイトル「GovTech Bridgeとは」: 中央配置 ✓
  - 説明テキスト: 中央配置 ✓
  - 「GovTech Bridgeとは」ボタン: 中央配置 ✓(左右の余白が等しい)
  - 「会員登録はこちらから」テキスト: 中央配置 ✓
  - 2つの登録ボタン: 左右対称に配置 ✓

  判定理由:
  - vrt-conditions.md の「5. 要素の位置を定量的に測定」に基づき、中央揃え要素の検証を実施
  - 過去の見逃し事例(32px位置ズレ)の教訓を踏まえ、主要要素の位置を定量的に確認
  - すべての要素が適切に中央配置されており、±2pxを超える位置ズレは検出されず

  ---
  総合評価

  差分総数: 1件(MINOR)

  リリース判定: ✅ リリース可能

  理由:
  - 検出された差分はボタン幅の4px程度の微差のみ
  - レイアウト構造、要素の有無、テキスト内容、色、位置関係すべて一致
  - 中央揃え要素の位置ズレなし(過去の見逃し事例を踏まえた重点チェック項目をクリア)
  - ユーザー体験に影響を与える差分は存在しない

  備考:
  - ボタン幅の微差はブラウザのレンダリング差異やフォントレンダリングの影響と推測される
  - デザインレビューのタイミングで確認してもよいが、リリースブロッカーではない

mdファイルの調整がもっと必要そうですね。
位置ズレは正確に検知できなかったです。

まとめ

コンポーネント単位で試してみましたが、
位置ズレ以外は正しく検知できていてGoodと思いました!

確認したい箇所は絞り込んで確認させるのはありかもですね!

今回は軽く検証しただけなので、
まだ検証の余地はあるかと思います!☺️

14
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?