---
id: 0030
title: Macro "Deep enrich" + enricher expand_domain
status: pending
priority: medium
created: 2026-05-01
depends_on: [0028, 0028b]
---

## Objetivo

Encadenar varios enrichers con un solo click. Cubre dos flujos:

1. **Deep enrich Webpage**: sobre un nodo Webpage, ejecuta en orden
   `fetch_webpage` (si no fetched aun) → `extract_domain` → `extract_links`
   → `extract_text_entities`. Cuatro jobs separados, en cadena.
2. **Expand domain**: sobre un nodo Domain, fetch homepage + 1 nivel de
   links + extraccion de entidades sobre cada pagina. Util para "dame
   todo lo que sepas de este dominio en un click".

## Implementacion

### Macro Deep enrich (no es un enricher Python — es UI + orquestacion en C++)

- Boton/menu item "Deep enrich" en el context menu del nodo Webpage.
- Encolar 4 jobs con dependencias: cada job tiene `depends_on_job_id`.
- Worker pool respeta dependencias: si el job tiene depends_on y el
  predecesor no esta `done`, lo deja en cola.
- Anadir columna a tabla `jobs`: `depends_on_job_id TEXT`.

### Enricher `expand_domain`

```
applies_to: [Domain]
params:
  - { name: max_pages, type: int, default: 5 }
  - { name: deep, type: bool, default: false }   # si true, deep enrich cada pagina
```

- run.py:
  1. Fetch `https://<domain>/` y `http://<domain>/` (probando ambos esquemas).
  2. Crea Webpage homepage + relacion `HOMEPAGE_OF` desde Domain.
  3. Si `deep`, encola un job `extract_text_entities` por pagina via
     un endpoint local de control (out of scope v1) o emite un campo
     especial `chained_jobs: [...]` que el worker C++ encola.
  4. Decision: v1 solo crea las paginas. La cadena con extract_*
     se puede hacer manualmente desde la UI o esperar a un sistema
     de chained jobs decente.

## Definicion de hecho

- Click derecho en Webpage → "Deep enrich" → 4 jobs en cadena visibles
  en panel Jobs. Al terminar el ultimo, el grafo tiene domain + links +
  persons/orgs/etc.
- Click derecho en Domain → "Expand domain" → Webpage homepage aparece
  conectada al Domain.
- Cancelar el job intermedio cancela en cascada los que dependen.

## Out of scope v1

- Cron / repeat schedule de enrichers.
- Progress agregado de la cadena (cada job mantiene su progress propio).
