AI記者が試した確認済Read in English

Impeccable検証:仕込んだ崩れ4つのうち3つを検出、タップ領域は素通り

連載「AI記者が試した」 npx一つ・APIキー無しで動き、ルール62個・JSON出力・終了コード2は説明どおり。URLを調べるにはブラウザの指定とroot向けの回り道が必要だった

鈴木 理恵|2026.10.31|12分|更新: 2026.10.31

AIが作ったUIの癖を見つけるImpeccableのdetectを、AI記者がコンテナで試した。APIキーもインストールも要らず、Inter・グラデーション文字・小さい本文は指摘し、終了コード2でCIでも落とせた。ただし小さいタップ領域を調べる規則は62個の中に無く、URLを調べるにはブラウザの指定とroot向けの回り道が要った。

Key Points

Impeccable検証:仕込んだ崩れ4つのうち3つを検出、タップ領域は素通り

Claude Code や Cursor に画面を作らせると、フォントはいつも Inter、見出しは紫から青のグラデーション、本文の字は小さめ、という似た顔の UI ができがちだ。こうした「AIが作ったっぽさ」を、マージ前に目で確かめる代わりにコマンドで洗い出そうという道具が Impeccable である。エージェントに読ませるデザインスキルに、決まったルールで判定する検出器 npx impeccable detect が付いている。

ESLint や Prettier はコードの書き方は見ても、配色やフォント、字の大きさは見ない。detect が見るのはまさにそこで、LLM を使わないので API キーも要らない。結果はターミナルの表示と JSON だけなので、手元でそのまま確かめられる。今回は連載「AI記者が試した」として、AI記者が使い捨てのコンテナに実際に入れ、作者の主張を一つずつ確かめた。

作者は何と言っているか

README などで作者が示していることのうち、今回確かめたのは次の6つだ。

一方、スラッシュコマンドでエージェントに UI を直させたときの効果(作例に出ている改善)は、LLM を実際に走らせて比べないと分からない。今回は試していない。

AI記者がやったこと

環境は Ubuntu 24.04(arm64)のコンテナで、GPU は無い。リポジトリを clone(約2.9秒)して README の detect の説明を読んだあと、わざと崩した HTML を用意した。崩し方は4つ。フォントは Inter だけ、見出しはグラデーション文字、本文は11px、ボタンとリンクは20px四方(中の文字は10px)。比べるために、崩していない HTML も別のフォルダに置いた。

そのうえで、フォルダを調べる、規則の一覧を出す、JSON で出す、URL を調べる、存在しないパスを渡す、Tailwind のクラスで書いた JSX を調べる、を順に試した。打ったコマンドは全部で27、そのうち7回は0以外の終了コードで終わった。ただし4回は「指摘があったので2」という想定どおりの終わり方で、本当に失敗したのは URL まわりの2回と、わざと存在しないフォルダを渡した1回だ。コマンドの実行時間を足すと約15.6秒、最初から最後までで約93秒だった。使ったのは npm の impeccable 4.8.0。

主張ごとの判定

1. npx 一つでディレクトリを調べられる──確かめられた

npx -y impeccable detect site/ は、設定ファイルもキーも無しに約2.8秒で終わり、5件の指摘を出して終了コード2で止まった。この2.8秒にはパッケージの取得も入っているとみられる。2回目以降の --version や --list-rules、きれいな HTML の検査は、どれも0.4〜0.6秒ほどで終わった。

わざと崩したHTMLをdetectし5件の指摘が出た画面
わざと崩したHTMLをdetectし5件の指摘が出た画面

Tailwind のクラスで書いた JSX(bg-gradient-to-r from-purple-500 to-pink-500 bg-clip-text の見出し)も調べられ、gradient-text と ai-color-palette の2件が出た。ただし .jsx は「regex matching only」と自分で表示する。つまり文字列の照合しかせず、tiny-text のようにページを解析して判定する規則は動かない。JSX に書いた font-[Inter] も overused-font として指摘されなかった。

2. 規則は62個──確かめられた

detect --list-rules の出力の最後には「62 rules.」と出た。規則の ID を抜き出して数えても62行あった。このうち16個には advisory(失敗に数えない参考扱い)が付いている。

list-rulesの末尾に62 rules.と表示された画面
list-rulesの末尾に「62 rules.」と表示された画面

3. 4つの崩れを指摘する──一部確かめられた

ファイルとして調べたときの指摘は、overused-font(Primary font: inter)、gradient-text、tiny-text(11px body text)、ai-color-palette などだった。4つの崩れのうち、Inter・グラデーション文字・小さい本文の3つは見つけている。紫系の配色も、AI らしい色づかいとして別に指摘された。

一方、20px のボタンとリンクは指摘されなかった。規則の一覧を touch・tap・target で絞り込んでも、タップ領域の大きさを調べる規則は62個の中に無い。リポジトリ全体を検索すると、touch target という言葉はスキルの参考文書(audit.md など)にしか出てこなかった。エージェントに読ませる指針としては書いてあるが、detect の検出器では調べない、ということになる。

4. JSON で出る──確かめられた

detect --json site/ の出力をファイルに保存すると、Python の json.load でそのまま読めた。中身は5件のリストで、各件に antipattern・name・description・severity・category・file・line・snippet がある。ただし line は HTML だと0、JSX だと1で、何行目かを指す値としては当てにできなかった。

--jsonの出力をPythonで読み5件を一覧にした画面
--json の出力を Python で読み、5件を一覧にした画面

5. 終了コード2で CI を落とせる──確かめられた

崩した HTML は2、きれいな HTML は何も表示せずに0、存在しないフォルダは「cannot access」と出して1。--json を付けても2だった。example.com を調べたときは advisory が3件出たが終了コードは0で、参考扱いの指摘は失敗に数えていない。0・1・2がはっきり分かれているので、CI の判定にそのまま使える作りだ。ただし、実際の CI に組み込んで動かしてはいない。

6. URL を描画して調べる──一部確かめられた

ここが一番つまずいた。detect https://example.com をそのまま実行すると「No Chrome, Chromium, Edge, or Brave installation found」と出て、終了コード1で止まった。コンテナには Playwright の Chromium が入っていたが、Impeccable はそれを自分では見つけなかった。

URL指定でChromeが見つからず終了コード1で止まった画面
URL を指定すると Chrome が見つからず、終了コード1で止まった画面

環境変数 IMPECCABLE_BROWSER でその Chromium を指すと、今度は「Running as root without --no-sandbox is not supported」で起動に失敗した。--no-sandbox を付けて Chromium を起動するだけのシェルスクリプトを作り、それを指すとようやく動いた。example.com は通常の指摘0件・advisory 3件(straggler)で終了コード0。自分の崩した HTML を file:// で開くと3件で終了コード2になった。

描画モードで同じHTMLを調べ3件の指摘が出た画面
描画モードで同じ HTML を調べ、3件の指摘が出た画面

ファイルとして調べたときは5件だったのに、描画モードでは overused-font(Inter)が消えた。コンテナに Inter が入っておらず、実際には代わりのフォントで描かれたからだと思われるが、確かめてはいない。同じページでも、調べ方によって指摘が変わることは覚えておきたい。

つまずいたところ

使うなら・待つなら

使うなら:エージェントに作らせた HTML や CSS を、マージ前に一度通す見張りとしてならすぐ使える。キーも設定も要らず、1秒前後で終わり、終了コードで CI を止められる。Inter・グラデーション文字・紫系の配色・小さすぎる本文といった「ありがちな顔」は、実際に見つけた。

待つなら・ほかと併せるなら:タップ領域の大きさのようなアクセシビリティの検査は、この検出器には入っていない。アクセシビリティ専用の検査道具と併用する前提で考えたい。コンポーネントを JSX で書いているチームは、文字列の照合しか効かない点も割り引いておく必要がある。URL を調べるモードを root のコンテナで使うなら、ブラウザの指定とサンドボックスの回り道を最初から用意しておくこと。

検証の条件

試していないこと:スラッシュコマンドでエージェントに UI を直させる使い方(LLM を走らせる必要があるため)と、作例にある改善の効果。ESLint やアクセシビリティ専用の検査道具との比較。Google Chrome そのものを入れた環境や、root 以外のユーザーでの実行。Inter を実際に入れた環境での描画モード。Vue や Svelte のファイル、大きな実プロジェクトでの検査と、誤検知の割合。CI への実際の組み込み。macOS や Windows での動作。

音声版

YouTube で見る

風刺画: Impeccable検証:仕込んだ崩れ4つのうち3つを検出、タップ領域は素通り

Editorial Cartoon

本記事がもたらす影響を風刺的に描いたひとコマ漫画

Verification

信頼ラベル確認済
一次ソース1件確認
最終検証2026.10.31
VerifiedRev. 2
sha256:5cf2a601efa8fbbf...def7f216

この記事はEd25519デジタル署名で検証済みです。改ざんは検出されていません。

検証API
Ethics Score89/100
引用密度19/20
ソースURL数10/20
信頼ラベル15/15
表現の慎重さ15/15
キーポイント10/10
サマリー品質10/10
本文充実度10/10

v1.0.0 — ルールベース自動採点

詳細API
Share

関連記事

Obsidian製「Pele」、ブラウザなしで1パッケージからMermaidを描けた 速さも確認、ただしgzipは230kBではなく約258kB
AI記者が試した確認済

Obsidian製「Pele」、ブラウザなしで1パッケージからMermaidを描けた 速さも確認、ただしgzipは230kBではなく約258kB

Obsidian の Mermaid→SVG レンダラー Pele をコンテナで検証した。npm install で入るのは1パッケージだけで、ブラウザなしの Node.js から7種の図を描けた。1枚あたり0.1ms前後と速い。ただし gzip 後の大きさは主張の230kBではなく約258kBだった。

2026.10.24
Context Mode、作者のデータでは「299B」「155B」をほぼ再現――ただし減るのは AI が集計コードか intent を渡したときだけ、素の cat の77KB はそのまま返った
AI記者が試した確認済

Context Mode、作者のデータでは「299B」「155B」をほぼ再現――ただし減るのは AI が集計コードか intent を渡したときだけ、素の cat の77KB はそのまま返った

今週約4,200スターを集めた Context Mode を、AI記者がコンテナで動かした。Node 22 なら API キーなしで動き、作者のデータでは298B・154B と主張どおりの数字が出た。ただし減るのは集計コードか intent を渡したときで、素の cat なら77KB が丸ごと返った。

2026.10.17
HyperFrames、「同じHTMLから同じMP4」は確かめられた ただしarm64では手順どおりに入れても書き出せなかった
AI記者が試した確認済

HyperFrames、「同じHTMLから同じMP4」は確かめられた ただしarm64では手順どおりに入れても書き出せなかった

HTMLをMP4に変えるHyperFramesを、AI記者がarm64・GPUなしのコンテナで試した。2回の書き出しはSHA-256も全90フレームも一致し、APIキーも要らなかった。一方で案内のbrowser --installは存在せず、arm64ではブラウザを手で差し替えるまで書き出せなかった。

2026.10.10