diff --git a/CAPABILITIES_TODO.md b/CAPABILITIES_TODO.md index ce12300..157d418 100644 --- a/CAPABILITIES_TODO.md +++ b/CAPABILITIES_TODO.md @@ -2,7 +2,7 @@ title: Capacidades de navegador (CDP) + construcción del MCP full-CDP artefacto: project · projects/web_scraping created: 06/06/2026 00:00 -updated: 06/06/2026 07:00 +updated: 06/06/2026 09:00 status: in_progress related_issues: [] related_flows: [] @@ -244,6 +244,18 @@ Prioridad BAJA (formularios compuestos, emulación device, performance, drag): ## Hecho (lo que YA tenemos) +- [x] **Gap #1 — bucle percibir→actuar por `#ref` + auto-observe** (06/06/2026, 9/9 e2e) + - `#ref` = `backendDOMNodeId` (estable, no el efímero del AX) → ref→acción + refs estables resueltos + juntos y **stateless** (sin mapa en el MCP). Validado con dump de AXNode real antes de codear. + - Funciones nuevas: `cdp_click_xy_human` (primitivo de click humanizado por coords, compartido por + selector/#ref/visión), `cdp_click_ref`, `cdp_type_ref`, `cdp_hover_ref`. `cdp_click_human` + refactorizado para usar el primitivo (un solo camino de click). + - MCP: tools `dom_click_ref`/`dom_type_ref`/`dom_hover_ref` con **auto-observe** (devuelven el outline + tras la acción). browser_mcp v0.3.0, **39 tools**. + - `render_ax_outline` mejorado (defectos F1): guard de ciclo + profundidad, sin `ljust`, renderiza `value`. + - Validado prueba e2e 9: login en the-internet **solo por `#ref`**, sin un selector CSS. + - Pendiente de la familia: política de humanización por sesión (`human`/`fast`/`instant`). + - enlace: functions/browser/cdp_{click_xy_human,click_ref,type_ref,hover_ref}.go + render_ax_outline.py - [x] **Tanda de deuda A+D+E+B — 4 fixes + 8/8 e2e** (06/06/2026) - **A** aislamiento robusto: `chrome_launch` usa el binario real (salta el wrapper que pisaba flags). - **D** `sessionStorage` añadido a `storage_state` (save+load). Validado por prueba e2e 6. @@ -433,6 +445,115 @@ funcionó**. Evaluado contra el bucle PERCIBIR → DECIDIR → ACTUAR → VERIFI --- +## Roadmap MCP de clase — benchmark Playwright + Visión (apuntado 06/06/2026) + +Objetivo: pasar de "wrapper con ~36 tools" a un MCP de clase. La métrica NO es el número de tools +(Playwright MCP ~60, Chrome DevTools MCP 26) — gran parte de los 60 de Playwright son inflado (storage +desglosado, video/tracing). Lo que sube el nivel real es **cerrar los 4 gaps de clase + dar al agente +tres sentidos de percepción→acción**. + +### Los tres sentidos del agente (percepción → acción) + +El agente tendrá tres vías para "ver" una página y actuar sobre ella. Cada una necesita su puente a la acción: + +1. **DOM / AX tree** (hoy parcial) — `page_perceive` → outline con `#ref`. **Falta el puente `#ref` → acción.** +2. **Texto** (hoy) — `cdp_get_text` (compacto, selector opcional). +3. **Visión** (futuro, el usuario aportará los modelos) — screenshot → **OCR** (texto + bbox) + **YOLO** + (objetos + bbox) → el agente ve la página como imagen. **Puente a la acción = coordinate mouse** + (`click_xy` sobre el bounding box detectado). Por esto coordinate mouse NO es inflado: es el sentido + de la mano para el ojo visual. + +### Transversal — humanización SIEMPRE en las acciones (anti-detección) + +REGLA DE DISEÑO: todas las acciones de ratón/teclado del agente usan por defecto la variante humanizada +(curva de Bézier + jitter + micro-pausas variables), no el evento sintético directo. Ya existen +`cdp_click_human` y `cdp_move_mouse_human`; el `cdp_type_text` ya escribe char a char con pausa. Aplicar: + +- El puente `#ref` → acción (A1) y `click_xy` (C1) deben ir **por defecto** por el camino humanizado + (mover el ratón con Bézier hasta el destino + click con micro-pausa press/release), no por + `Input.dispatchMouseEvent` seco. Exponer un flag `instant=true` solo para tests/velocidad. +- Donde falte versión humanizada (scroll, drag_xy), crear la variante con jitter/easing. +- Objetivo: que el tráfico de input sea indistinguible de un humano — es ventaja nuestra frente a + Playwright/CDP-MCP, que no humanizan. No perderla al añadir tools nuevas. + +### A. Gaps de clase (los 4 que de verdad suben el nivel) + +- [x] **A1 — Puente `#ref` → acción** ✅ (06/06). `cdp_click_ref`/`cdp_type_ref`/`cdp_hover_ref` + primitivo + `cdp_click_xy_human`. Tools MCP `dom_click_ref`/`type_ref`/`hover_ref`. Validado prueba e2e 9. + Hoy el outline da `#ref=44` pero el LLM no puede usarlo: tiene que volver a selector CSS. Cierra el loop + percibir↔actuar. **Gap #1 ahora.** +- [x] **A2 — Refs estables** ✅ (06/06). Resuelto stateless: el `#ref` ES el `backendDOMNodeId` (estable + mientras el nodo viva), no el `nodeId` efímero del AX. Sin mapa de estado en el MCP. `render_ax_outline` actualizado. +- [x] **A3 — Auto-observe tras acción** ✅ (06/06). Las tools `_ref` del MCP devuelven el outline AX + actualizado tras la acción (settle 400ms + perceiveOutline). Verificación implícita. Validado prueba 9. +- [ ] **A4 — Política de target segura en el MCP** (P0 seguridad). `cdp_connect_target` da la herramienta; + falta la regla: el MCP lanza Chrome propio (perfil + puerto dedicados, ya en 9333) o exige target + explícito; nunca engancha a la tab del 9222 por `match=""`. +- [ ] **A5 — Intercept / mock de red** (`Fetch.enable`) (P0 programático). Mockear APIs, bloquear recursos, + inyectar headers. La tool más valiosa de Playwright (`route`). Hoy 0. + +### B. Tools valiosas del benchmark Playwright (delta real, ~12) + +- [ ] **B1 verbos de formulario**: `hover`, `select_option` (`