---
id: 0035a
title: Tipo Group + columna group_id en entities (plumbing)
status: done
priority: high
created: 2026-05-03
parent: 0035
---

## Objetivo

Plumbing invisible al usuario. Tras esta tarea no hay cambio visual; solo
infraestructura preparada para que las fases siguientes puedan crear
grupos sin tocar mas schema.

## Cambios

1. **Schema `entities`**: anadir columna `group_id TEXT NULL` (sin
   indice todavia, sin FK constraint — la integridad la mantiene el
   codigo).
2. **Migracion idempotente**: cuando la app abre una `operations.db`
   existente sin esa columna, `ALTER TABLE entities ADD COLUMN group_id
   TEXT` se ejecuta una vez. Detectar via `PRAGMA table_info(entities)`
   antes de alterar.
3. **Tipo `Group`** en:
   - `examples/types.yaml` (template para proyectos nuevos)
   - `local_files/projects/default/types.yaml` del install Windows
     (para que el proyecto activo del usuario lo vea)
4. **Definicion del tipo**:
   - shape: `square`
   - color: `#94A3B8` (slate neutro)
   - icon: `ti-stack-2`
   - principal_field: `name`
   - fields: `name` (string, required), `count` (int), `enricher` (string),
     `batch_id` (string)

## Acceptance criteria

- `sqlite3 <ops.db> ".schema entities"` muestra `group_id TEXT`.
- Abrir una BD vieja (sin columna) la migra al primer arranque sin
  perder datos.
- `Group` aparece en el Type Editor con sus fields y atributos visuales.
- Tests pytest siguen verdes en WSL y Windows (32 / 21 + 11 skipped).
- App sigue arrancando y abriendo proyectos existentes sin warnings ni
  errores de schema.

## TBD

Branch `issue/0035a-group-type-and-schema` en el sub-repo del app,
merge `--no-ff` a `master` con tests verdes.

## Out of scope

- Crear entidades de tipo Group (eso es 0035c).
- Filtrar el renderer (eso es 0035b).
- Doble click en Group (eso es 0035d).
