Skip to content

RIGOR ​

Implementación ​

Motor de Diff (Normativo – v0.1) ​

Estado: Normativo Alcance: Define el cálculo determinista de las diferencias estructurales entre dos instancias de Grafo Canónico.

Este documento formaliza el algoritmo interno, contratos, garantías y restricciones del Motor de Diff.


1. Propósito ​

El Motor de Diff calcula un ChangeSet que representa las diferencias estructurales entre:

  • Un Grafo Canónico previo (G₁)
  • Un Grafo Canónico actual (G₂)

Es responsable de:

  • Detectar adiciones
  • Detectar eliminaciones
  • Detectar modificaciones
  • Clasificar tipos de cambio
  • Producir un ChangeSet determinista

NO DEBE:

  • Realizar validación
  • Realizar migraciones
  • Mutar ninguno de los grafos
  • Aplicar cambios

2. Contratos de Entrada y Salida ​

2.1 Entrada ​

diff(previous: CanonicalGraph, current: CanonicalGraph): ChangeSet

Ambos grafos DEBEN estar canonicalizados antes del diff.

El motor DEBE rechazar grafos no canónicos.


2.2 Salida ​

El motor DEBE retornar:

ChangeSet {
    status: "no-change" | "changed"
    changes: OrderedCollection<Change>
    summary: ChangeSummary
}

El status DEBE ser "no-change" si y solo si no existen diferencias estructurales.


3. Modelo Core de Diff ​

El Diff opera sobre:

  • Identidad de nodos
  • Atributos de nodos
  • Relaciones de aristas (edges)

La comparación DEBE ser:

  • Determinista
  • Independiente del orden
  • Basada en rutas canónicas e IDs de nodo

4. Coincidencia de Identidad (Identity Matching) ​

Los nodos DEBEN ser emparejados por:

  1. Ruta canónica
  2. Clave de identidad estable (si está definida)

Si un nodo existe en G₂ pero no en G₁ → ADD (ADICIÓN) Si un nodo existe en G₁ pero no en G₂ → REMOVE (ELIMINACIÓN) Si existe en ambos → comparar atributos y aristas


5. Tipos de Cambio ​

Cada Cambio DEBE ser uno de:

  • ADD_NODE
  • REMOVE_NODE
  • MODIFY_ATTRIBUTE
  • ADD_EDGE
  • REMOVE_EDGE
  • REORDER (solo si está semánticamente ordenado)

El conjunto de tipos de cambio DEBE ser estable y versionado.


6. Esquema del Objeto de Cambio ​

Cada cambio DEBE incluir:

Change {
    type: ChangeType
    path: CanonicalPath
    nodeType: NodeType
    attribute?: string
    oldValue?: any
    newValue?: any
    metadata?: object
}

Los campos DEBEN estar presentes solo cuando sean relevantes.


7. Algoritmo de Diff (Comportamiento Normativo) ​

El algoritmo DEBE:

Fase 1 – Comparación del Conjunto de Nodos ​

  • Construir mapas de nodos indexados por ruta canónica
  • Identificar nodos añadidos
  • Identificar nodos eliminados

Fase 2 – Comparación de Atributos ​

Para los nodos emparejados:

  • Comparar conjuntos de atributos
  • Detectar atributos añadidos
  • Detectar atributos eliminados
  • Detectar atributos modificados

La comparación de atributos DEBE ser profunda y determinista.

Fase 3 – Comparación de Aristas (Edges) ​

Para los nodos emparejados:

  • Comparar aristas salientes
  • Detectar adiciones y eliminaciones
  • Detectar reordenamiento semántico (si aplica)

Fase 4 – Normalización ​

  • Ordenar los cambios determinísticamente
  • Eliminar cambios redundantes
  • Finalizar el ChangeSet

8. Reglas de Ordenamiento Determinista ​

Los cambios DEBEN ser ordenados por:

  1. Ruta canónica (lexicográfica)
  2. ChangeType (precedencia interna estable)
  3. Nombre del atributo (si aplica)

Los mismos grafos de entrada DEBEN producir ChangeSets idénticos.


9. Reglas de Igualdad Profunda (Deep Equality) ​

La comparación profunda DEBE:

  • Comparar escalares estrictamente
  • Comparar mapeos recursivamente
  • Comparar conjuntos sin orden por su forma canónica ordenada
  • Comparar listas ordenadas por posición

La comparación de puntos flotantes DEBE ser exacta a menos que la Especificación defina una tolerancia.


10. Manejo de Reordenamiento Semántico ​

Para colecciones semánticamente ordenadas:

  • Un cambio en el orden DEBE producir un REORDER
  • La implementación DEBE detectar el delta de reordenamiento mínimo

Para conjuntos sin orden:

  • Las diferencias de orden NO DEBEN producir cambios

11. Optimización por Hash Estructural (Opcional) ​

Si el Grafo Canónico incluye un hash estructural:

  • Una discrepancia de hash PUEDE disparar la comparación profunda
  • La igualdad de hash PUEDE cortocircuitar el diff

El uso de hash NO DEBE afectar la corrección.


12. Objeto de Resumen (Summary) ​

El ChangeSummary DEBE incluir:

ChangeSummary {
    totalChanges: number
    additions: number
    removals: number
    modifications: number
    reorders: number
}

Los conteos DEBEN ser consistentes con el ChangeSet.


13. Expectativas de Rendimiento ​

El Motor de Diff DEBERÍA operar en:

O(N + E)

Donde:

  • N = nodos
  • E = aristas

La comparación de atributos DEBERÍA evitar comportamientos cuadráticos.

El uso de memoria DEBERÍA escalar linealmente.


14. Consideraciones para Grafos Grandes ​

El motor DEBERÍA:

  • Usar mapas de hash para la búsqueda de nodos
  • Evitar escaneos completos anidados
  • Evitar comparaciones redundantes

El diff por streaming es OPCIONAL y DEBE permanecer determinista si se implementa.


15. Integración con el Motor de Versionado ​

El ChangeSet DEBE ser consumible por:

  • Motor de Versionado
  • Motor de Migraciones
  • Salida del CLI

El Motor de Diff NO DEBE interpretar reglas de incremento de versión.


16. Manejo de Errores ​

El Diff NO DEBERÍA producir errores semánticos.

PUEDE producir errores fatales si:

  • Se violan invariantes del grafo
  • Se detecta colisión de ruta canónica
  • Se proporciona un grafo no canónico

Tales errores DEBEN ser deterministas.


17. Estabilidad entre Versiones ​

Los tipos de cambio y la estructura de salida DEBEN estar versionados.

Los cambios de ruptura en el esquema del ChangeSet DEBEN incrementar la versión mayor de RIGOR.


18. No-Objetivos ​

El Motor de Diff NO:

  • Valida la corrección
  • Clasifica la severidad semántica
  • Decide el incremento de versión
  • Aplica migraciones
  • Genera parches (patches)

Solo describe diferencias estructurales.


19. Criterios de Conformidad ​

Una implementación es conforme si:

  • Produce ChangeSets deterministas
  • Identifica correctamente adiciones/eliminaciones/modificaciones
  • Ignora el orden no semántico
  • Preserva un ordenamiento estable de los cambios
  • Opera solo sobre grafos canonicalizados

20. Resumen ​

El Motor de Diff:

  • Compara dos Grafos Canónicos
  • Produce un ChangeSet estructural determinista
  • Es independiente del orden
  • Es inmutable y puro
  • Es fundamental para la evolución y el versionado

Protocolo de Restricción de IA