chore: auto-commit (13 archivos)

- CAPABILITIES_TODO.md
- demo_e2e/RESUMEN.md
- demo_e2e/results/prueba_1_quotes.json
- demo_e2e/results/prueba_2_perceive.json
- demo_e2e/results/prueba_3_search.json
- demo_e2e/results/prueba_4_login_session.json
- demo_e2e/results/prueba_5_books.json
- demo_e2e/results/prueba_6_session_storage.json
- demo_e2e/results/prueba_7_find_honesto.json
- demo_e2e/results/prueba_8_verificacion.json
- ...

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-06 13:20:36 +02:00
parent 23f9aa90e8
commit 618e3b0295
13 changed files with 363 additions and 64 deletions
+122 -1
View File
@@ -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` (`<select>`), `file_upload` (`DOM.setFileInputFiles`),
`drag`/`drop`.
- [ ] **B2 network observability**: `network_requests` (lista en vivo) + `network_request` (inspeccionar uno).
Complementa el HAR post-mortem.
- [ ] **B3 `console_messages`**: capturar consola + excepciones JS (`Runtime.consoleAPICalled`). Debug + detección.
- [ ] **B4 assertions (modo programático)**: `verify_element_visible` / `verify_text_visible` / `verify_value`.
Es el EJE VERIFICAR aplicado a recetas YAML (assert por paso).
### C. Coordinate mouse — IMPORTANTE (base del modo visión)
Reclasificado de "inflado" a importante por el usuario: es el puente entre visión (bbox de OCR/YOLO) y acción.
- [ ] **C1** `cdp_click_xy(x, y)` — click por coordenadas (sobre lo que la visión detecta).
- [ ] **C2** `cdp_move_xy` / `cdp_mouse_down` / `cdp_mouse_up` — control fino del ratón por píxeles.
- [ ] **C3** `cdp_drag_xy(x1,y1,x2,y2)` — drag por coordenadas.
- [ ] **C4** `cdp_scroll` ya existe; añadir target por coordenadas/elemento (P1.5).
### D. Misc — IMPORTANTE
- [ ] **D1** `cdp_save_pdf` (`Page.printToPDF`) — exportar página a PDF.
- [ ] **D2** `cdp_get_console` (= B3) — consola + excepciones.
- [ ] **D3** `cdp_resize` / `cdp_emulate_device` (`Emulation.setDeviceMetricsOverride`) — viewport conocido
(clave para visión: coordenadas estables) + mobile/touch.
- [ ] **D4** `cdp_nav_back`/`forward` ya existen; `wait_for` cubierto por wait_load/idle/element.
- [ ] Screenshot como **MCP image content** (hoy `page_screenshot` va a archivo → el LLM no lo ve). Prerequisito
del modo visión.
### E. VISIÓN (OCR + YOLO) — tarea futura, el usuario aporta los modelos
- [ ] **E1** Pipeline de percepción visual: `page_screenshot` (a buffer) → **OCR** (texto + bbox) + **YOLO**
(objetos UI + bbox) → estructura `{label, text, bbox}` que el agente consume como "outline visual".
- [ ] **E2** Función `ocr_page` y `detect_ui_elements` (los modelos los aportará el usuario). Dominio nuevo
(¿`vision`?) o `browser`. Probable Python (modelos ML).
- [ ] **E3** Puente visión → acción vía coordinate mouse (sección C): el agente clica el centro del bbox.
- [ ] **E4** Screenshot como image content en el MCP (D) para que el LLM también vea el píxel directamente.
- Nota: la visión es el tercer sentido — complementa, no sustituye, al AX outline (que es más barato en
tokens). Útil cuando el DOM miente (canvas, iframes cross-origin, apps que pintan en `<canvas>`).
### F. Defectos de calidad a corregir en lo ya construido (del coach)
- [x] **F1** ✅ (06/06) `render_ax_outline`: guard de ciclo (`visited`) + límite de profundidad (`_MAX_DEPTH=60`);
`ljust(60)` eliminado; renderiza el `value` de inputs (`= 'texto'`). Hecho en la misma edición del `#ref`.
- [ ] **F2** `cdp_get_html` sin límite: **documentar** que es "crudo a propósito" (la vía compacta es
get_text + outline).
- [ ] **F3** `cdp_connect_target` con `match=""`: documentar que es inseguro fuera del MCP; la política
segura vive en A4.
- [ ] **F4** Limpieza de recursos: isolated worlds que crea `cdp_eval_in_frame`, conexiones del pool del MCP.
### G. Inflado de Playwright — NO construir salvo necesidad concreta
Storage granular desglosado (cookie/localStorage/sessionStorage × get/set/delete/list/clear = 17 tools;
nosotros lo hacemos con 6), video/tracing/highlight (9 tools de debug visual de testing), `generate_locator`,
`run_code_unsafe` (= nuestro `page_eval_js`). Replicar esto sube el contador a ~45 sin añadir poder.
### Telemetría
`call_monitor` ya existe — cada tool del MCP encaja sin trabajo extra.
---
## Enlaces
- App orquestadora — projects/web_scraping/apps/script_navegador (CLI rápido: open/click/type/eval/html/shot/wait/tabs/launch/close/profiles + runner YAML)