Cadeno
Рекордер браузерных потоков · Chrome MV3

Вы показали это один раз.
Почему вы всё ещё делаете это вручную?

Skill Recorder — расширение Chrome, которое смотрит, как вы проходите браузерную задачу один раз, и затем пишет SKILL.md — спецификацию на чистом markdown, которую Claude Code (или любой агент на CLI browse) воспроизводит без селекторов, glue code и присмотра.

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}}
↑ пятиминутный поток создания заказа,
записан один раз и воспроизводится вечно.
Анатомия

Три стадии, на расстоянии одного клика.

Мы поставляем небольшое расширение Chrome MV3 и пайплайн дистилляции на 4 КБ. Рекордер цепляется к chrome.debugger для DOM-уровня точности; дистилляция целиком работает в service worker; воспроизведение читает итоговый SKILL.md через CLI browse. Никакого сервера. Никакого glue code.

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 того же источника прозрачно прокалываются.

  • Шестиуровневый резолвер селекторов (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

Шесть небольших проходов превращают шумный лог событий в детерминированную спецификацию. Автопараметризация срабатывает только выше уверенности 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

CLI browse читает SKILL.md как чистый markdown — без схемы, без рантайма, без лазеек. Каждый шаг аудируем.

  • идемпотентные повторы · auth-пауза + возобновление
  • структурированные логи ↦ JSONL-история воспроизведений
  • работает с Claude Code, Cline, обычным shell
Спецификация

Что переживёт запись? Тринадцать сложных случаев от начала до конца.

Браузер полон ловушек для рекордеров — хешированные классы, ленивые модалки, Shadow DOM, потоки между вкладками, IME-композиция, drag-and-drop. Каждая строка ниже — реальная фикстура в playground; кликните по любой, чтобы записать против неё самому.

зелёная точка = выпущено · синяя = автоматически
КатегорияТехникаКак мы с этим справляемсяФикстура
Селекторы
Ротация хеш-классов и ID

Tailwind-классы вроде btn__primary--ab3f9c меняются при каждом деплое; резолвер проходит 6 уровней (testid → id → aria → text → css → xpath), так что перехешированная кнопка всё равно попадает.

A2
Селекторы
Одинаковые соседние строки

Шесть строк с буквально одинаковыми кнопками "Pick" — отличается только позиция. Мы привязываем каждый клик через fingerprintIndex, поэтому кликается нужная строка даже после переупорядочивания.

A3
Селекторы
Идентификаторы вне зависимости от локали

"Continue" / "继续" / "Weiter" мапятся на один data-i18n-key="action.continue". Рекордер предпочитает локале-независимые атрибуты, поэтому skill, записанный на английском, воспроизводится на китайском.

A4
Async
Переходы маршрутов SPA

Переходы pushState и hashchange отслеживаются без перезагрузки; воспроизведение ждёт монтирования нового контента вместо опроса пустого контейнера.

B1
Async
Лениво смонтированные модалки

Кнопка Confirm не существует в момент клика по триггеру. elementVisible опрашивает, пока цель не появится, прежде чем диспатчить следующий шаг — никаких хрупких timeout-ов.

B3
Поверхности
iframe того же источника

all_frames: true инжектится в каждый фрейм; действия тегируются frameId источника и перерезолвятся по URL между re-render-ами, так что устаревший 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
Ввод
Нативный drag & drop

Цепочка dragstart → dragover → drop с общим DataTransfer сливается в один шаг drag (источник + цель + наблюдаемые типы). Никаких хрупких пиксельных координат.

D1
Ввод
Сочетания модификаторов

Чистое "k" — это шум текстового ввода; с metaKey: true это сочетание Cmd-K. Рекордер оставляет комбо, отбрасывает шум, сохраняет состояние модификатора для воспроизведения.

D3
Ввод
Блоки contenteditable

change никогда не срабатывает на contenteditable. Цепляемся к input + compositionend, debounce 300 мс, эмитим один шаг change с финальным innerText — та же форма, что у текстового поля.

D4
Ввод
ARIA combobox и typeahead

Каждый шаг клика обогащается comboboxContext (текст опции, корневой селектор); если прямой клик при воспроизведении не сработал, fallback набирает текст, ArrowDown до совпадения aria-activedescendant, затем Enter.

D6

Тринадцать из шестнадцати. Плюс четыре составные фикстуры — Notion, Linear, Jira, Salesforce — которые связывают от двенадцати до пятнадцати этих техник в один связный поток. Смотрите playground →

Практический пример

Пятиминутный браузерный ритуал, дистиллированный до тридцати секунд.

Полевой блокнотЗаписано 2026-02-19, 16:42 UTCВоспроизведено 50× без вмешательства

Каждое утро в понедельник операционный инженер у небольшого поставщика открывает один и тот же портал, кликает Новый заказ, вставляет SKU из CSV, набирает количество и кликает Отправить. И снова. И снова. Двести строк в неделю, каждую неделю, последние четырнадцать месяцев. Это пятиминутный ритуал, повторяемый до конца таблицы.

Именно такому типу задач продают рекордер — и именно на таких задачах большинство рекордеров проваливается. Портал поставщика крутит хеши классов Tailwind при каждом деплое. Кнопка Отправить живёт внутри динамической строки таблицы, которая ре-рендерится после каждого сохранения. Auth-cookie истекает в полдень. Selenium-скрипты против этой страницы в среднем выживают две недели, а затем тихо начинают ломаться.

Запись

Инженер прикрепляет расширение к панели инструментов, открывает портал, кликает Начать запись и выполняет задачу ровно один раз. Восемь кликов, два введённых значения, одна отправка. Боковая панель показывает живой поток событий — включая шум: прокрутка, focus, blur, случайные mousemove над иконкой помощи. Двадцать три события за 4,6 секунды.

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
Восемь нажатий становятся одним параметризованным fill — та же форма при каждом воспроизведении.

Передача

Инженер кладёт получившийся markdown в ~/.claude/skills/create-purchase-order/SKILL.md и пишет одну фразу Claude Code. Агент находит skill по имени, разрешает предусловие (сохранённый cookie действителен до полудня), проходит пятьдесят строк CSV и докладывает. Через три минуты одиннадцать секунд работа сделана. Никто не наблюдал.

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
Одна фраза на входе, пятьдесят заказов на выходе. Агент не задал ни одного вопроса.
Постскриптум
Стоимость пятиминутного ритуала,
амортизированная на рабочий год.
4:18min
медиана вручную
3.8sec
медиана агента
~187hrs/yr
сэкономлено, только эта задача
Хотите увидеть на более жёстких фикстурах? Попробуйте playground →
Получите рекордер

main.cta.title

Бесплатно во время открытой беты. Без аккаунта, без загрузки, без телеметрии. Весь бандл — 4,5 МБ; записи живут на вашей машине, пока вы не решите их экспортировать.

SKILL.md — контракт на чистом markdown между людьми и агентами.v0.4.1 · Updated 2026-02-19