Skip to content

RIGOR

Implementación

Constructor de Grafo Canónico (Normativo – v0.1)

Estado: Normativo Alcance: Define la construcción del Grafo Canónico a partir de la Representación Intermedia (IR).

Este documento formaliza el modelo estructural interno utilizado por todos los motores subsiguientes.


1. Propósito

El Constructor de Grafo Canónico transforma la Representación Intermedia (IR) en un Grafo Canónico determinista e inmutable.

El Grafo Canónico es la única fuente estructural de verdad para:

  • Validación
  • Diff
  • Versionado
  • Migración
  • Resolución de eventos

Ningún motor puede operar directamente sobre la IR.


2. Principios Core

El Grafo Canónico DEBE ser:

  1. Determinista
  2. Inmutable después de la construcción
  3. Consistente en identidad
  4. Completamente resuelto (sin referencias sin resolver)
  5. Independiente del orden del YAML

El Constructor DEBE garantizar Grafos Canónicos idénticos para entradas de IR semánticamente idénticas.


3. Modelo Conceptual

El Grafo Canónico es un grafo dirigido y tipado compuesto por:

  • Nodos
  • Aristas (Edges)
  • Rutas Canónicas

3.1 Nodo

Un Nodo DEBE contener:

  • ID de Nodo estable
  • Tipo
  • Atributos (tipados)
  • Aristas salientes
  • Ruta Canónica

Los IDs de Nodo DEBEN ser deterministas y estables entre ejecuciones.


3.2 Arista (Edge)

Una Arista DEBE contener:

  • ID de Nodo Origen
  • ID de Nodo Destino
  • Tipo de Arista
  • Metadatos opcionales

Las aristas DEBEN representar relaciones estructurales o referenciales.


3.3 Ruta Canónica

Cada nodo DEBE tener una ruta canónica única que represente su posición en el grafo.

Las rutas canónicas DEBEN:

  • Ser deterministas
  • Ser independientes del orden del YAML
  • Permanecer estables entre representaciones equivalentes

Ejemplo (conceptual):

/processes/order/states/approved

La sintaxis de la ruta canónica es definida por la implementación, pero DEBE ser estable.


4. Tipado de Nodos

Cada nodo DEBE tener un tipo definido.

Ejemplos de tipos de nodos (ilustrativos, no exhaustivos):

  • Raíz (Root)
  • Proceso (Process)
  • Estado (State)
  • Transición (Transition)
  • Evento (Event)
  • Entidad (Entity)
  • Restricción (Constraint)
  • Versión (Version)

La implementación DEBE definir un conjunto exhaustivo de tipos de nodos alineados con la Especificación.

Los tipos de nodos DEBEN estar fuertemente tipados internamente.


5. Fases de Construcción del Grafo

El Constructor de Grafo Canónico DEBE operar en fases ordenadas.


Fase 1: Construcción de la Raíz

  • Crear nodo raíz
  • Validar tipo de raíz de la IR
  • Inicializar registros globales

Fase 2: Creación de Nodos Estructurales

  • Crear nodos para todas las secciones de nivel superior
  • Crear nodos para estructuras anidadas
  • Asignar rutas canónicas provisionales

En esta etapa, las referencias PUEDEN permanecer sin resolver.


Fase 3: Registro de Identidad

  • Registrar todos los nodos que poseen identidad
  • Forzar la unicidad
  • Detectar identificadores duplicados

Las identidades duplicadas DEBEN producir un error fatal.


Phase 4: Resolución de Referencias

  • Resolver referencias entre nodos
  • Validar existencia
  • Crear aristas
  • Detectar referencias circulares si son inválidas

Las referencias sin resolver DEBEN producir errores de validación o errores fatales dependiendo de la severidad.


Fase 5: Finalización de la Ruta Canónica

  • Normalizar rutas canónicas
  • Aplicar reglas de ordenamiento determinista
  • Congelar el orden de los nodos

Después de esta fase, el grafo DEBE ser inmutable.


6. Reglas de Identidad

Los nodos que poseen identidad DEBEN:

  • Tener identificadores globalmente únicos dentro de su alcance
  • Ser registrados antes de la resolución de referencias
  • Producir rutas canónicas deterministas

La comparación de identidad DEBE ser sensible a mayúsculas y minúsculas (case-sensitive) a menos que se defina lo contrario.


7. Reglas de Ordenamiento Determinista

El Constructor DEBE aplicar un ordenamiento determinista para:

  • Secciones de nivel superior
  • Nodos dentro de las secciones
  • Atributos dentro de los nodos
  • Aristas

El ordenamiento DEBERÍA ser por defecto lexicográfico por identificador, a menos que la Especificación defina un ordenamiento semántico.

El orden de entrada del YAML NO DEBE afectar el orden final del grafo.


8. Garantía de Inmutabilidad

Después de la construcción del grafo:

  • Los nodos NO DEBEN ser mutados
  • Las aristas NO DEBEN ser alteradas
  • Los atributos NO DEBEN cambiar

Cualquier transformación (ej., migración) DEBE crear una nueva instancia de Grafo Canónico.


9. Manejo de Errores durante la Construcción

El Constructor PUEDE producir:

  • Errores estructurales
  • Errores de identidad
  • Errores de referencia

Los errores DEBEN:

  • Incluir la ruta canónica (si está disponible)
  • Incluir un código de error estable
  • Ser deterministas en el orden de reporte

Los errores fatales DEBEN detener la construcción.


10. Manejo de Referencias Circulares

El Constructor DEBE:

  • Detectar referencias circulares ilegales
  • Permitir estructuras circulares solo si la Especificación lo permite
  • Producir detección de ciclos determinista

La detección de ciclos DEBE ser algorítmicamente estable.


11. Garantías de Integridad del Grafo

Un Grafo Canónico válido DEBE garantizar:

  • Todos los nodos referenciados existen
  • No hay identidades duplicadas
  • No hay nodos requeridos huérfanos
  • Rutas canónicas completamente construidas
  • Orden de recorrido determinista

12. Requisitos de Recorrido

El Grafo Canónico DEBE soportar:

  • Recorrido en profundidad (DFS)
  • Recorrido en anchura (BFS)
  • Iteración determinista
  • Búsqueda por ruta canónica
  • Búsqueda por ID de nodo

El orden de recorrido DEBE ser estable entre ejecuciones.


13. Expectativas de Rendimiento

La construcción del grafo DEBERÍA:

  • Ser O(N + E)
  • Evitar la resolución de referencias cuadrática
  • Usar registros de identidad eficientes (ej., hash maps)

La complejidad en el peor de los casos DEBE ser documentada si es diferente.


14. Consideraciones Multi-Spec

Si se soporta la carga de múltiples especificaciones (multi-spec):

  • Cada especificación DEBE producir un Grafo Canónico independiente
  • Las referencias entre especificaciones DEBEN definirse explícitamente
  • La fusión de grafos DEBE ser determinista

Si no está soportado, las referencias entre especificaciones DEBEN ser rechazadas.


15. Consideraciones de Seguridad

El Constructor DEBE:

  • Evitar la ejecución de código dinámico
  • Evitar la instanciación basada en reflexión a partir de entradas no confiables
  • Proteger contra ataques de anidamiento profundo

La profundidad máxima de recursión DEBERÍA estar limitada.


16. Contrato de Salida

El Grafo Canónico DEBE exponer:

CanonicalGraph {
    nodes: OrderedCollection<Node>
    root: Node
    lookupById(id)
    lookupByPath(path)
    traversalIterator()
}

La estructura interna exacta PUEDE variar, pero las garantías lógicas DEBEN cumplirse.


17. Integración con Siguientes Etapas

El Grafo Canónico es la única entrada para:

  • Motor de Canonicalización
  • Motor de Validación
  • Motor de Diff
  • Motor de Versionado
  • Motor de Migración
  • Motor de Resolución de Eventos

Ningún motor puede consumir la IR directamente.


18. No-Objetivos

El Constructor de Grafo Canónico NO:

  • Valida reglas semánticas
  • Evalúa restricciones
  • Realiza diff
  • Clasifica cambios
  • Genera artefactos

Solo construye la estructura.


19. Criterios de Conformidad

Una implementación es conforme si:

  • Produce Grafos Canónicos deterministas
  • Impone la unicidad de identidad
  • Resuelve las referencias determinísticamente
  • Garantiza la inmutabilidad
  • Produce rutas canónicas estables

20. Resumen

El Constructor de Grafo Canónico:

  • Convierte la IR en un grafo tipado
  • Impone la identidad estructural
  • Resuelve referencias
  • Congela la estructura determinista
  • Sirve como base de todo el motor

Protocolo de Restricción de IA