--- id: 0035b title: Renderer oculta hijos de grupos colapsados + dedup de aristas grupo-a-grupo status: done priority: high created: 2026-05-03 parent: 0035 depends_on: [0035a] --- ## Objetivo El renderer aprende a esconder entidades cuyo `group_id` apunta a un grupo colapsado, y a deduplicar aristas que cruzan dos grupos colapsados a una sola linea por par de grupos. Sin este paso, los grupos creados por enrichers (0035c) seguirian mostrando todos sus hijos en el canvas. ## Cambios 1. **Estado de expansion en RAM**: `unordered_map` en AppState (`group_expanded`). Default: vacio (todos los grupos colapsados al arranque). No persiste entre sesiones (fase 1). 2. **Filtro al cargar el grafo** (`graph_load_from_operations` o wrapper en el app): tras leer entities de la BD, descartar las que tengan `group_id != NULL` y cuyo grupo padre no este expandido. Las aristas cuyos extremos esten descartados tambien se omiten. 3. **Deduplicacion de aristas inter-grupo**: cuando ambos extremos de una arista caen dentro de grupos colapsados (incluso el mismo), colapsamos el conjunto a UNA linea por par `(group_a, group_b)`. Sin peso visual, sin grosor variable. Solo deduplicacion topologica. 4. **Centralizar el filtro**: aplicarlo dentro del loader (no en cada caller). Hoy el grafo se recarga desde toolbar reload, dirty_counter de jobs, chat mutations marker, switch project — el filtro debe funcionar en TODAS estas rutas. ## Acceptance criteria - Insertando manualmente en BD un `Group` + un Url con `group_id` que apunte a el, recargar el grafo muestra solo el cuadrado, no el Url. - Si el Url tiene una arista a un Domain externo, la arista no se dibuja al Url oculto pero SI se dibuja al cuadrado del grupo. - Si dos Urls dentro del mismo grupo tienen aristas a un Domain externo, se dibuja UNA sola arista del grupo al Domain (dedup). - Con `group_expanded[id] = true` (manualmente seteado a efectos de test, no hay UI todavia), los hijos vuelven a aparecer y las aristas se dibujan a su extremo real. - Tests pytest verdes. ## TBD Branch `issue/0035b-renderer-hides-grouped-children` en el sub-repo, merge `--no-ff` a master con tests verdes. ## Out of scope - UI para expandir/colapsar grupo (drilling se hace via tableview en 0035d, no expandiendo en canvas). - Layouts internos del grupo expandido (fase 3). - Agregacion de aristas con peso visual (fase 3).