---
id: 0029
title: Enrichers via Chrome headless (CDP) — fetch_webpage_browser, fetch_screenshot
status: pending
priority: medium
created: 2026-05-01
depends_on: [0028]
---

## Objetivo

Variantes de los enrichers basicos que usan Chrome headless via CDP,
para sitios con contenido renderizado por JavaScript (SPA, paginas con
auth visual, etc.) o cuando se quiere capturar evidencia visual.

## 1. `fetch_webpage_browser`

```
applies_to: [Url, Webpage]
emits: [Domain]
relations: [BELONGS_TO]
params:
  - { name: chrome_port, type: int, default: 9222 }
  - { name: wait_after_load_ms, type: int, default: 1500 }
```

- Usa funciones del registry:
  - `chrome_launch_go_browser` — lanza Chrome en port (reusa si ya esta).
  - `cdp_connect_go_browser`
  - `cdp_navigate_go_browser`
  - `cdp_wait_load_go_browser`
  - `cdp_get_html_go_browser` — DOM post-JS.
- El run.py shell-out a un binario Go pequeno o llama estas funciones via
  un wrapper Python que invoca el Go function como subprocess.
- Decision pendiente: empaquetar las funciones Go en un binario CLI
  `cdp-fetcher` que el run.py invoque, o reescribir la logica en Python
  con `pychrome` / `playwright`. Preferencia: binario Go para reusar las
  funciones del registry.

## 2. `fetch_screenshot`

```
applies_to: [Webpage, Url]
params:
  - { name: full_page, type: bool, default: true }
```

- `cdp_screenshot_go_browser` → guarda `cache/<sha>.png`.
- `node_updates`: anade `screenshot_path` a metadata del Webpage.
- No emite entidades nuevas.

## Definicion de hecho

- `fetch_webpage_browser` extrae correctamente DOM de una SPA (test:
  twitter.com, linkedin.com publico).
- `fetch_screenshot` produce PNG legible en el cache.
- Inspector del nodo Webpage muestra una preview del screenshot
  cuando `screenshot_path` existe (mejora UI opcional).

## Out of scope

- Login flows / auth via CDP — fuera de v1.
- Adblock / fingerprint evasion — el user-agent default es suficiente.
