Cadeno
ブラウザフローレコーダー · Chrome MV3

一度デモした。
なぜまだ自分でやっているのか?

Skill Recorder は Chrome 拡張機能で、あなたが一度だけブラウザタスクを通すのを見守ります — そして SKILL.md を書き出します。これは Claude Code(あるいは browse CLI 上のあらゆるエージェント)がセレクタもグルーコードも見守りも不要で再生できる、プレーンマークダウンの仕様書です。

v0.4.14.5 MB bundleMV3 service worker21 fixtures12 locales
~/Downloads/recordings/2026-03-create-po.jsonrecording
RAW EVENTS23 captured · 4.6s elapsed
01navigate "/orders/new" // 304 → 200
02click "button.tabs__new" // data-tab=create
03focus "#sku"
04type "SKU-1029" // 8 keystrokes, 1.2s
05blur "#sku"
06type "50" // into #qty
07click "button.submit" ⚠ inside dynamic list
… 16 more (scroll · focus · mousemove · blur · resize)
distilled in 30s ↓
SKILL.md4 steps · 2 inputs · 1 precondition
01# create-purchase-order
02
03// precondition: signed in to supplier portal
04
05## inputs
06- {{sku}} // auto-detected · 8 chars · alphanumeric
07- {{quantity}} // auto-detected · int · 1–999
08
09## steps
101. navigate "/orders/new"
112. fill "#sku" with {{sku}}
123. fill "#qty" with {{quantity}}
134. click submit row matching {{sku}}
↑ 5 分の発注書フローを
一度録画して永遠に再生。
解剖

3 つのステージ、クリック 1 つの距離。

私たちが出荷するのは、小さな Chrome MV3 拡張機能と 4 KB の蒸留パイプラインです。レコーダーは chrome.debugger にフックして DOM レベルの忠実度を出し、蒸留は service worker 内で完結し、再生は browse CLI が結果の SKILL.md を読みます。サーバーなし、グルーコードなし。

i.

捕捉

サイドパネル
Skill RecorderREC
00:01click nav.Orders
00:02click btn.New
00:04focus #sku
00:05type "SKU-1029"
00:06blur #sku
00:08type "50" → #qty
00:09click btn.Submit

content script の フレームごとのポートがすべての DOM イベントを service worker に転送します。Shadow DOM と同一オリジン iframe は透過的に貫通します。

  • 6 段階のセレクタ解決(testid → id → aria → text → css → xpath)
  • tabPorts: Map<tabId, Map<frameId, Port>>
  • IME を認識する入力バッファ · paste · drag
23 イベント →
ii.

蒸留

Service worker · 30 秒
dedupe consecutive clicks23 → 16
fold keystrokes into type()16 → 11
detect inputs as {{params}}conf 0.94
mark auth boundary+1 precondition
parameterize URL segments2 swapped
flag dynamic-list clicks1 ⚠ note

6 つの小さなパスがノイズの多いイベントログを決定的な仕様に変えます。自動パラメータ化は信頼度 0.7 以上でのみ発火し、それ以下では推測ではなく質問します。

  • paramConfidence(step) — ヒューリスティックのラダー
  • auth-boundary 検出 — 不透明トークン + cookies
  • UUID · 数値 ID · email · ISO 日付 · 通貨
SKILL.md →
iii.

再生

browse CLI
~/work $ claude
> create POs for these 50 rows
Reading ~/.claude/skills/create-purchase-order/SKILL.md Loaded 4 steps · 2 params · 1 precondition ▸ resolving precondition: signed in to supplier portal cookie present, expires 2026-08-04 ▸ running batch [50 rows] 50/50 in 3m 11s 0 retries, 0 manual rescues

browse CLI は SKILL.md をプレーンマークダウンとして読みます — スキーマなし、ランタイムなし、抜け穴なし。すべてのステップが監査可能です

  • 冪等な再実行 · 認証一時停止 + 再開
  • 構造化ログ ↦ JSONL の再生履歴
  • Claude Code、Cline、通常のシェルで動作
仕様

録画は何を生き抜く?13 の難所、エンドツーエンド。

ブラウザはレコーダーの罠だらけです — ハッシュ化されたクラス、遅延モーダル、Shadow DOM、複数タブのフロー、IME 合成、ドラッグアンドドロップ。下の各行はプレイグラウンドの実在のフィクスチャです。クリックすれば自分で録画できます。

緑のドット = リリース済 · 青 = 自動
カテゴリ技術我々の対処フィクスチャ
セレクタ
ハッシュクラス & ID のローテーション

btn__primary--ab3f9c のような Tailwind 風クラスは毎デプロイで変わります。リゾルバは 6 段階(testid → id → aria → text → css → xpath)を辿るので、再ハッシュされたボタンも当たります。

A2
セレクタ
同一の兄弟行

文字どおり同じ "Pick" ボタンが 6 行 — 位置でしか区別できません。fingerprintIndex でクリックを固定するので、リストが並び替わっても正しい行をクリックします。

A3
セレクタ
ロケール非依存の識別子

"Continue" / "続ける" / "Weiter" はすべて同じ data-i18n-key="action.continue" にマップされます。レコーダーはロケール非依存属性を優先するので、英語で録った Skill が日本語ページで再生されます。

A4
非同期
SPA ルート遷移

pushState と hashchange の遷移はリロードなしで追跡されます。再生は空のコンテナをプロービングする代わりに新コンテンツのマウントを待ちます。

B1
非同期
遅延マウントモーダル

トリガーがクリックされた時点で Confirm ボタンは存在しません。elementVisible がターゲット出現までポーリングしてから次のステップをディスパッチします — フレーキーな timeout なし。

B3
表面
同一オリジンの iframe

all_frames: true でフレームごとに注入。アクションには発火元 frameId が付与され、再レンダリング時に URL で再解決されるので、古い frameId が再生を止めません。

C1
表面
機密フィールドの伏字化

password / phone / クレジットカード / SSN 入力は type + autocomplete + name で検出され、ストレージに入る前に *** に置換されます。バイトはページから出ません。

C2
表面
Shadow DOM 貫通

カスタムの shadow セレクタ種別がパスを { host, inner } セグメントとしてエンコードし、リゾルバが各境界で shadowRoot.querySelector を歩きます。Web Components は一級市民です。

C3
表面
タブ間ハンドオフ

フローが新タブを開くとき — 印刷プレビュー、OAuth、見積生成 — 録画は chrome.tabs.onCreated で追随します。再生は chrome.tabs.create でタブを再生成します。

C4
入力
ネイティブのドラッグ & ドロップ

共通の DataTransfer を持つ dragstart → dragover → drop チェーンが 1 つの drag ステップに合成されます(ソース + ターゲット + 観測された型)。脆いピクセル座標なし。

D1
入力
修飾キーコンボ

単独の "k" は文字入力のノイズ。metaKey: true が付くと Cmd-K ショートカットです。レコーダーはコンボを残してノイズを捨て、修飾状態を再生に保ちます。

D3
入力
contenteditable ブロック

contenteditable で change イベントは絶対に発火しません。input + compositionend をフックし、300 ms デバウンスし、最終的な innerText で 1 つの change ステップを発します — テキスト入力と同じ形。

D4
入力
ARIA combobox & タイプアヘッド

各クリックステップは comboboxContext(オプションテキスト、ルートセレクタ)で強化されます。再生時に直接クリックが失敗したら、テキスト入力 → aria-activedescendant が一致するまで ArrowDown → Enter にフォールバックします。

D6

16 のうち 13。加えて 4 つの複合フィクスチャ — Notion、Linear、Jira、Salesforce — がこれらの技術を 12〜15 個まで一連のフローにつなぎます。プレイグラウンドを見る →

実例

5 分のブラウザ儀式、30 秒に蒸留。

現地ノート録画 2026-02-19, 16:42 UTC介入なしで 50 回再生

毎週月曜の朝、小さなサプライヤーの運用エンジニアは同じポータルを開き、新規発注書をクリックし、CSV から SKU を貼り、数量を入力し、送信をクリックします。そしてまたやります。週 200 行、毎週、14 か月続いています。スプレッドシートが終わるまで繰り返す 5 分の儀式です。

これはまさにレコーダーが売り込まれるタイプのタスクであり、ほとんどのレコーダーが失敗するタイプのタスクです。サプライヤーポータルはデプロイごとに Tailwind ハッシュクラスを回転させます。送信ボタンは保存のたびに再レンダリングされる動的な行の中にあります。認証 cookie は正午に期限切れになります。このページに対して書かれた Selenium スクリプトは平均 2 週間生き延び、その後静かに壊れ始めます。

録画

エンジニアは拡張機能をツールバーに固定し、ポータルを開き、開始録画をクリックし、タスクをちょうど一度実行します。8 回のクリック、2 つの入力値、1 回の送信。サイドパネルにイベントのライブフィードが表示されます — ノイズも含めて:スクロール、focus、blur、ヘルプアイコンへのうっかりマウスムーブ。4.6 秒で 23 イベントを捕捉。

raw events · 23経過 4.6 秒
01 navigate "/orders/new" // 304 → 200 02 click "button.tabs__new" // data-tab=create 03 focus "#sku" 04 type "SKU-1029" // 8 keystrokes 05 blur "#sku" 06 focus "#qty" 07 type "50" 08 click "button.submit" inside .row[data-id=r9]16 more (scroll · focus · mousemove · blur · resize)
生ログはすべてを保持し、蒸留が何が重要かを決める。

蒸留

main.example.p4

before / after23 イベント → 4 ステップ
— BEFORE (raw)
type "S" → #sku
type "K" → #sku
type "U" → #sku
type "-" → #sku
type "1" → #sku
type "0" → #sku
type "2" → #sku
type "9" → #sku
+ AFTER (distilled)
fill "#sku" with {{sku}}
+ AUTO-DETECTED
// 8 chars · alphanumeric · prefix SKU-
// confidence 0.94
8 回のキーストロークが 1 つのパラメータ化された fill になる — 再生のたびに同じ形。

引き渡し

エンジニアは生成された markdown を ~/.claude/skills/create-purchase-order/SKILL.md に置き、Claude Code に一文だけ入力します。エージェントは名前で Skill を見つけ、前提条件を解決し(保存された cookie は正午まで有効)、CSV の 50 行を反復処理して報告します。3 分 11 秒後、仕事は完了。誰も見ていませんでした。

claude code · stdout3 分 11 秒 · 0 リトライ
> create purchase orders for the rows in ~/Desktop/feb-orders.csv Reading ~/.claude/skills/create-purchase-order/SKILL.md 4 steps · 2 params · 1 precondition Resolving precondition: signed in to supplier portal cookie present (expires 2026-02-19 12:00 UTC) Running batch (50 rows) 50/50 submitted 0 retries · 0 manual rescues median 3.8s per row · longest 5.1s
一文入って、50 件の発注書が出る。エージェントは質問を一切しなかった。
後記
5 分の儀式のコスト、
1 年分に均すと。
4:18min
手動の中央値
3.8sec
エージェントの中央値
~187hrs/yr
このタスクだけで回収
もっと難しいフィクスチャで見たい?プレイグラウンドを試す →
レコーダーを手に入れる

1 つのフローを録画。次の 1000 回はエージェントに任せる。

オープンベータ期間中は無料。アカウント不要、アップロードなし、テレメトリなし。バンドル全体で 4.5 MB。録画はあなたのマシンに留まり、エクスポートを選ぶまで動きません。

SKILL.md — 人とエージェントの間のプレーンマークダウン契約。v0.4.1 · Updated 2026-02-19