Files
graph_explorer/issues/0035c-web-search-creates-groups.md
T
egutierrez fc4f0824da feat(0035a): tipo Group + columna group_id en entities
Plumbing para issue 0035 — agrupacion de resultados de enrichers
cuando exceden umbral. Sin cambios visibles para el usuario todavia.

- Migracion idempotente: ALTER TABLE entities ADD COLUMN group_id si
  no existe (detectado via PRAGMA table_info). Se ejecuta al abrir
  el proyecto en switch_to_project y en el bootstrap inicial.
- Tipo Group en examples/types.yaml (template) y en el types.yaml
  del proyecto default activo en Windows.
- shape=square (regla en types_registry.cpp extendida a Group),
  color=#94A3B8, icon=ti-stack-2.
- Fields: name (req), count (int), enricher (string), batch_id (string).

Refs: issues/0035a-group-type-and-schema.md
2026-05-03 14:23:23 +02:00

2.5 KiB

id, title, status, priority, created, parent, depends_on
id title status priority created parent depends_on
0035c web_search crea Group cuando excede umbral (Twitter/Reddit preview) pending high 2026-05-03 0035
0035a
0035b

Objetivo

Que web_search deje de vomitar 100+ Urls sueltos. Cuando el numero de resultados excede el umbral, crea un nodo Group que contiene la mayoria; los primeros K quedan sueltos como preview directo del source.

Cambios

  1. Threshold: leer auto_group_threshold del manifest si esta presente; fallback a constante global 50 (hardcoded por ahora; settings UI viene en fase 2). Para web_search/manifest.yaml no declaramos override — usa el default.
  2. Preview K: constante global 10 (primeros K resultados quedan sueltos colgando del source con SEARCH_RESULT_OF normal).
  3. Creacion del grupo en run.py: si len(results) >= threshold:
    • Insertar entidad Group con type_ref='Group', name='web_search: <query> (<N>)', metadata que incluya enricher='web_search', query, count=N, batch_id=<UUID>.
    • Insertar relacion SEARCH_RESULT_OF desde el Group al source.
    • Insertar los primeros K resultados como Urls sueltos (comportamiento actual, con batch_id en metadata).
    • Insertar los restantes N-K como Urls con group_id=<id_group> y batch_id=<UUID> en metadata. Cada uno mantiene su relacion individual SEARCH_RESULT_OF al source (NO al grupo — la procedencia es la relacion real).
  4. batch_id: UUID4 generado al inicio del run, compartido por todos los nodos creados en esa ejecucion (group + sueltos + hijos del grupo).

Acceptance criteria

  • web_search con un mock que devuelve 5 resultados: NO crea Group. Comportamiento actual.
  • web_search con un mock que devuelve 100 resultados: crea 1 Group
    • 10 Urls sueltos + 90 Urls con group_id.
  • Todos los nodos creados (group + sueltos + agrupados) comparten metadata.batch_id.
  • En el canvas (con 0035b ya en master): aparecen 10 Urls + 1 cuadrado Group colgando del source. Los 90 Urls dentro del Group estan ocultos.
  • Tests pytest nuevos:
    • test_web_search_below_threshold_no_group
    • test_web_search_above_threshold_creates_group_and_preview
    • test_web_search_batch_id_shared_across_outputs
  • Tests existentes siguen verdes.

TBD

Branch issue/0035c-web-search-creates-groups, merge --no-ff con tests verdes.

Out of scope

  • Aplicar a otros enrichers (fase 2).
  • Cascada multi-tipo (decision 6, fase 2).
  • Regroup/promote desde tableview (fase 2).