DDR-008 — Reflect cura el grafo y los Insights viven dentro de él¶
Versión: 0.1.0 | Fecha: 2026-09-24 | Estado: Aceptado
Contexto¶
engrama_reflect detecta patrones entre entidades y escribe nodos
Insight para que una persona los revise. Tiene tres problemas.
- Los Insights son huérfanos por construcción. Reflect crea cada
Insight con
merge_nodey nunca lo enlaza con los nodos de los que habla. En un grafo en el que reflect se ejecuta con regularidad, los Insights son la mayoría de los nodos de grado 0. Inflan cualquier recuento de huérfanos, y no se puede llegar a ellos desde las entidades que describen. - Los detectores hacen ruido donde disparan y están ciegos donde importa.
shared_technologyemite un Insight por cada par de entidades que comparten una tecnología (N² por tecnología), sin excluir nodossupersededniarchived. La cola de revisión se llena de Insights casi idénticos que acaban descartados a mano.under_connectedfiltra conn.status <> 'archived', que en la lógica de tres valores de Cypher descarta todos los nodos que no tienenstatus. Además solo devuelve los 15 nodos más recientes, así que el backlog de nodos de grado 0 nunca aflora. El backend SQLite usaCOALESCEy se comporta de forma distinta.- No hay ningún detector para los problemas que de verdad degradan el grafo: entidades duplicadas, hub stubs, tags sin arista, puentes archivados y conflictos de label.
Decisión¶
Reflect pasa a ser el curador del grafo. Sus detectores son correctos y agregados, encuentra problemas estructurales además de patrones de dominio, cada Insight queda enlazado a su evidencia, y un Insight de curación aprobado puede llevar la acción no destructiva que corrige el problema que señala. La fusión de nodos queda deliberadamente fuera de este DDR.
En concreto¶
- Corrección de los detectores.
- Un único helper
live_filter(var), seguro frente a nulos (coalesce(n.status, 'active') NOT IN ['archived', 'superseded']), que usan todos los detectores en los dos backends. under_connectedinforma del recuento total más una muestra, en lugar deLIMIT 15.- Un test de paridad ejecuta cada detector sobre SQLite y Neo4j con el mismo fixture.
- Agregación.
shared_technologyemite un Insight por tecnología con 3 o más usuarios vivos, con la lista de miembros, en lugar de uno por par. Cada detector tiene un presupuesto por ejecución, para que una sola ejecución no pueda inundar la cola. - Detectores de curación.
orphans: grado 0, sin contar los Insights de sistema (DDR-006, punto 7). Los Insights escritos a mano cuentan como nodos de dominio aquí y en el resto de detectores, que hoy ignoran:Insightpor completo.hub_stubs: stub con grado ≥ 3.merge_candidates: pares del resolvedor por encima del umbral (DDR-006). Solo informa: resolver un candidato sigue siendo una decisión humana.tag_without_edge: tag que se resuelve a un ancla no enlazada.archived_bridges: nodos archivados cuyos vecinos están vivos.label_conflicts.archive_candidates: recencia al leer baja, grado bajo y sin vecinos vivos (DDR-007).- Los Insights quedan enlazados. Cada Insight recibe
(:Insight)-[:ABOUT]->(n)por cada entidad que devolvió su detector.ABOUTes un tipo de relación del núcleo, independiente del perfil. Las métricas de huérfanos excluyen los Insights de sistema por definición, yengrama_contextsobre una entidad muestra los Insights que hablan de ella. - Aprobaciones con acción. Un Insight de curación guarda una
proposed_actionlegible por máquina:link,enrichoarchive. Ninguna borra datos (archivees reversible mediante reactivación).engrama_approve_insight(..., apply=true)la ejecuta con las mismas tools que usaría una persona, dentro del scope de quien llama. Sinapply, aprobar se comporta como hoy. - Ciclo de vida de los Insights. Un Insight regenerado refresca su
body, su confianza y sus aristas
ABOUT, salvo que una persona ya lo haya juzgado (DDR-007, punto 5). La cola de revisión (engrama_surface_insights,engrama_approve_insight) solo maneja Insights de sistema, así que los escritos a mano nunca aparecen como pendientes.
Consecuencias¶
- Positivas:
- Los recuentos de huérfanos vuelven a medir el grafo de dominio.
- Revisar Insights se convierte en un ciclo de curación que corrige los problemas que señala.
- El ruido del detector de tecnologías baja un orden de magnitud.
- Negativas:
- Los duplicados se señalan pero no se resuelven: mientras no exista una operación de fusión, corregir uno implica reenlazar aristas a mano.
- Más detectores significa un reflect más lento. Reflect se ejecuta bajo demanda, y cada detector mantiene un presupuesto.
- Neutras:
- Los Insights existentes siguen funcionando. Reciben sus aristas
ABOUTla próxima vez que reflect los regenere.
Seguimientos abiertos (no bloqueantes)¶
- Una operación de fusión (
engrama_merge) que integre el nodo B en el nodo A: redirige las aristas, une las propiedades, conserva la clave de B como alias y registra suengrama_id. Es destructiva, así que tendrá su propio DDR, que cubra deshacer, auditoría y notas del vault, antes de implementarse. - Que un
EntityDecider(DDR-006) puntúe los candidatos a fusión en lugar de un umbral fijo. - Un informe
engrama health(solo lectura y con scope) que exponga las mismas métricas que los detectores de curación, para paneles y arneses de evaluación.