Cadeno
Grabador de flujos del navegador · Chrome MV3

Lo demostraste una vez.
¿Por qué sigues haciéndolo tú?

Skill Recorder es una extensión de Chrome que te ve recorrer una tarea del navegador una vez — y luego escribe un SKILL.md, una especificación en markdown puro que Claude Code (o cualquier agente sobre la CLI browse) reproduce sin selectores, glue code ni supervisión.

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}}
↑ un flujo de orden de compra de cinco minutos,
grabado una vez y reproducido para siempre.
Anatomía

Tres etapas, a un clic de distancia.

Lo que enviamos es una pequeña extensión de Chrome MV3 y una pipeline de destilación de 4 KB. El grabador engancha chrome.debugger para fidelidad a nivel DOM; la destilación corre íntegra en el service worker; la reproducción lee la SKILL.md resultante a través de la CLI browse. Sin servidor. Sin glue code.

i.

Capturar

Panel lateral
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

Un puerto por frame en el content script reenvía cada evento DOM al service worker. Shadow DOM e iframes del mismo origen se atraviesan de forma transparente.

  • Resolutor de selectores de 6 niveles (testid → id → aria → text → css → xpath)
  • tabPorts: Map<tabId, Map<frameId, Port>>
  • Buffer de entrada consciente de IME · paste · drag
23 eventos →
ii.

Destilar

Service worker · 30 s
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

Seis pequeñas pasadas convierten un log ruidoso de eventos en una especificación determinista. La autoparametrización solo se activa por encima de 0,7 de confianza; por debajo, el grabador pregunta en vez de adivinar.

  • paramConfidence(step) — escalera heurística
  • detección de auth-boundary — token opaco + cookies
  • UUID · ID numérico · email · fecha ISO · moneda
SKILL.md →
iii.

Reproducir

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

La CLI browse lee SKILL.md como markdown puro — sin esquema, sin runtime, sin escapatorias. Cada paso es auditable.

  • re-ejecución idempotente · pausa + reanudación de auth
  • logs estructurados ↦ historial JSONL
  • funciona con Claude Code, Cline, shell plano
Especificación

¿Qué sobrevive a una grabación? Trece casos duros, de punta a punta.

El navegador está lleno de trampas para grabadores — clases con hash, modales perezosos, Shadow DOM, flujos entre pestañas, composición IME, drag-and-drop. Cada fila abajo es una fixture real del playground; haz clic en cualquiera para grabar tú mismo contra ella.

punto verde = enviado · azul = automático
CategoríaTécnicaQué hacemos al respectoFixture
Selectores
Rotación de hash de clase e ID

Las clases estilo Tailwind como btn__primary--ab3f9c rotan en cada despliegue; el resolutor recorre 6 niveles (testid → id → aria → text → css → xpath), así que un botón re-hasheado sigue acertando.

A2
Selectores
Filas hermanas idénticas

Seis filas con botones "Pick" literalmente idénticos — solo la posición distingue. Anclamos cada clic con fingerprintIndex, así que se hace clic en la fila correcta, incluso si la lista se reordena.

A3
Selectores
Identificadores estables al locale

"Continue" / "继续" / "Weiter" mapean al mismo data-i18n-key="action.continue". El grabador prefiere atributos independientes del locale, así que un skill grabado en inglés se reproduce en chino.

A4
Async
Transiciones de ruta SPA

Las transiciones pushState y hashchange se siguen sin recargar; la reproducción espera a que se monte el nuevo contenido en lugar de sondear un contenedor vacío.

B1
Async
Modales montados con retraso

El botón Confirm no existe cuando se hace clic en el trigger. elementVisible hace polling hasta que aparece el destino antes de despachar el siguiente paso — sin timeouts frágiles.

B3
Superficies
iframes del mismo origen

all_frames: true inyecta por frame; las acciones se etiquetan con la frameId de origen y se re-resuelven por URL entre re-renderizados, así que una frameId obsoleta nunca bloquea la reproducción.

C1
Superficies
Redacción de campos sensibles

Las entradas password / phone / tarjeta / SSN se detectan por type + autocomplete + name y se reemplazan por *** antes de tocar el almacenamiento. Los bytes nunca abandonan la página.

C2
Superficies
Penetración Shadow DOM

Un tipo de selector shadow personalizado codifica la ruta como segmentos { host, inner }; el resolutor camina shadowRoot.querySelector en cada frontera, así que los Web Components son ciudadanos de primera clase.

C3
Superficies
Traspaso entre pestañas

Cuando un flujo abre una nueva pestaña — vista previa de impresión, OAuth, generación de cotización — la grabación sigue vía chrome.tabs.onCreated. La reproducción recrea la pestaña con chrome.tabs.create.

C4
Entrada
Drag & drop nativo

Una cadena dragstart → dragover → drop con un DataTransfer compartido se fusiona en un paso drag (origen + destino + tipos observados). Sin coordenadas de píxeles frágiles.

D1
Entrada
Combinaciones de modificadores

Una "k" sola es ruido de entrada de texto; con metaKey: true es un atajo Cmd-K. El grabador conserva el combo y descarta el ruido, preservando el estado del modificador para la reproducción.

D3
Entrada
Bloques contenteditable

change nunca dispara en contenteditable. Enganchamos input + compositionend, debounce de 300 ms y emitimos un paso change con el innerText final — misma forma que un campo de texto.

D4
Entrada
Combobox ARIA y typeahead

Cada paso de clic se enriquece con comboboxContext (texto de opción, selector raíz); si el clic directo falla en reproducción, el fallback escribe el texto, ArrowDown hasta que aria-activedescendant coincide, luego Enter.

D6

Trece de dieciséis. Más cuatro fixtures composite — Notion, Linear, Jira, Salesforce — que encadenan de doce a quince de estas técnicas en un único flujo coherente. Ver el playground →

Ejemplo trabajado

Un ritual del navegador de cinco minutos, destilado a treinta segundos.

Cuaderno de campoGrabado 2026-02-19, 16:42 UTCReproducido 50× sin intervención

Cada lunes por la mañana una ingeniera de operaciones de un pequeño proveedor abre el mismo portal, hace clic en Nueva orden de compra, pega un SKU desde un CSV, escribe una cantidad y hace clic en Enviar. Luego lo hace otra vez. Y otra. Doscientas filas por semana, cada semana, durante los últimos catorce meses. Es un ritual de cinco minutos repetido hasta que la hoja de cálculo termina.

Es justo el tipo de tarea para la que se vende un grabador — y exactamente el tipo en la que la mayoría de los grabadores fallan. El portal del proveedor rota hashes de clase Tailwind en cada despliegue. El botón Enviar vive dentro de una fila de tabla dinámica que se re-renderiza tras cada guardado. La cookie de auth caduca al mediodía. Los scripts de Selenium contra esta página sobreviven dos semanas de promedio y luego empiezan a fallar en silencio.

La grabación

La ingeniera ancla la extensión a la barra de herramientas, abre el portal, hace clic en Iniciar grabación y ejecuta la tarea exactamente una vez. Ocho clics, dos valores escritos, un envío. El panel lateral muestra un feed en vivo de eventos mientras ocurren — incluyendo el ruido: scroll, focus, blur, mousemoves accidentales sobre el icono de ayuda. Veintitrés eventos capturados en 4,6 segundos.

raw events · 23transcurridos 4,6 s
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)
El log crudo conserva todo; la destilación decide qué importa.

La destilación

main.example.p4

before / after23 eventos → 4 pasos
— 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
Ocho pulsaciones se vuelven un fill parametrizado — la misma forma cada reproducción.

El traspaso

La ingeniera coloca el markdown resultante en ~/.claude/skills/create-purchase-order/SKILL.md y escribe una sola frase a Claude Code. El agente encuentra el skill por nombre, resuelve la precondición (la cookie guardada sigue válida hasta mediodía), itera sobre las cincuenta filas del CSV y reporta de vuelta. Tres minutos once segundos después, el trabajo está hecho. Nadie lo vio correr.

claude code · stdout3 m 11 s · 0 reintentos
> 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
Una frase entra, cincuenta órdenes salen. El agente no hizo ninguna pregunta.
Posdata
El coste de un ritual de cinco minutos,
amortizado en un año de trabajo.
4:18min
mediana manual
3.8sec
mediana del agente
~187hrs/yr
recuperado, solo en esta tarea
¿Quieres verlo en fixtures más duras? Prueba el playground →
Consigue el grabador

main.cta.title

Gratis durante la beta abierta. Sin cuenta, sin subida, sin telemetría. El bundle completo es de 4,5 MB; las grabaciones viven en tu máquina hasta que decidas exportarlas.

SKILL.md — un contrato en markdown puro entre humanos y agentes.v0.4.1 · Updated 2026-02-19