chore: auto-commit (13 archivos)

- .gitignore
- CAPABILITIES_TODO.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-07 11:42:32 +02:00
parent 618e3b0295
commit 0b3a1313c2
13 changed files with 189 additions and 64 deletions
+51 -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 09:00
updated: 06/06/2026 10:00
status: in_progress
related_issues: []
related_flows: []
@@ -548,6 +548,56 @@ Storage granular desglosado (cookie/localStorage/sessionStorage × get/set/delet
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.
### H. Política de velocidad de interacción (human / fast / instant) — REFACTOR, no flag
**No es un flag, es un refactor del primitivo + breaking en el teclado.** Hoy el camino de acción es
human-only sin escape: `CdpClickXYHuman` siempre llama `CdpMoveMouseHuman` (25 puntos con sleeps), la
micro-pausa press/release (30-90ms) está hardcoded, `CdpTypeText` no tiene opts (delay 10ms/char hardcoded),
y `MouseHumanOpts` no tiene campo de modo (poner Steps=1 sigue moviendo y pausando). La política de 3 modos
exige tocar el primitivo, no pasar opts distintos.
**El eje que separa los 3 (clave): "¿dispara eventos de ratón reales?"**`fast` SÍ (mousemove/down/up,
movimiento reducido), `instant` NO (usa `element.click()` JS). Hay SPAs con listeners en hover/mousedown que
se rompen con instant pero funcionan con fast — eso justifica tener 3 y no 2.
| Parámetro | human (default) | fast | instant |
|---|---|---|---|
| Trayectoria ratón | Bézier ~25 pts | recta ~5 pts | sin movimiento |
| Duración move | 350-800ms | ~40-80ms | 0 |
| Jitter | 2px | 0-1px | 0 |
| Pausa press/release | 30-90ms | 5-15ms | 0 |
| Eventos ratón reales | sí | sí | no (`element.click()` JS) |
| Typing delay/char | 10-40ms var | 1-3ms | 0 (set value + `input` event) |
| Dispara hover/mousedown handlers | sí | sí | no |
| Sigilo anti-bot | alto | bajo | nulo |
| Caso de uso | agente vs detección | scraping masivo propio | tests + **fallback sin-bbox** |
**`instant` no es "solo tests": es el fallback obligatorio sin geometría.** `refBoxCenter` falla con error
duro si el nodo no tiene box model (display:contents, área 0 con handler). El camino instant
(`backendNodeId``DOM.resolveNode``Runtime.callFunctionOn` `.click()`) es el degradado natural cuando
la vía bbox no aplica. No añadir un 4º modo "paranoid" — tres y basta.
**Arquitectura (sin meter estado de sesión en las funciones stateless):**
- [x] **H1** ✅ (06/06) `Mode` (string `human`/`fast`/`instant`) en `MouseHumanOpts`. Branch en
`CdpMoveMouseHuman` (instant=no-op, fast=reducido) y `CdpClickXYHuman` (pausa derivada del modo, no
hardcoded). Toca el **primitivo compartido** → re-test de click_ref/human/xy. (medio)
- [x] **H2** ✅ (06/06) `MouseProfileForMode(mode)``MouseHumanOpts`**una sola fuente de verdad** del mapeo
modo→números, consumida por MCP + runner YAML + CLI (no duplicar). (pequeño)
- [ ] **H3** Teclado con config: `CdpTypeText` gana variante con delay/modo + instant via `set value` +
`input` event. **BREAKING** → blast radius `script_navegador` (uses_functions) + MCP `type_ref`;
**migrar consumidores en el mismo PR**. Es el corte que más cuidado pide. (medio)
- [x] **H4** ✅ (06/06) `instant` fallback en `CdpClickRef` (`element.click()` JS) cuando no hay bbox o Mode=instant.
- [~] **H5** parcial (06/06): override per-acción `mode` en tools MCP `dom_click_ref`/`dom_hover_ref`
(validado: human ~1212ms > fast ~590ms > instant ~499ms). PENDIENTE: estado de sesión
`browser_set_mode` + `mode:` en YAML + `--mode` CLI.
- [ ] **H6** Precedencia: **override per-acción > modo de sesión > default human**. Mantener el override
per-acción (instant puntual sobre un elemento sin bbox aunque la sesión sea human).
- [ ] **H7** e2e por modo: instant rompe sitio-con-hover, human/fast no — es la prueba que valida el eje.
**Los waits NO entran aquí** (`wait_idle` quietMs/timeout, `wait_load`) — son *correctness*, ortogonales al
sigilo. Pero documentar: en scraping masivo el throughput lo matan TANTO la humanización COMO los waits;
`mode: fast` sin ajustar waits no da toda la velocidad.
### Telemetría
`call_monitor` ya existe — cada tool del MCP encaja sin trabajo extra.