Ir al contenido
learn

6. Continuidad y artifact chain

Las cinco primeras lecciones siguen un artefacto hasta la revisión. Se detienen antes de una pregunta difícil: ¿qué ocurre cuando desaparece el agente dueño de un trabajo aceptado y un sucesor debe continuar sin duplicar el efecto ni heredar autoridad invisible?

La issue 76 de Gaia responde con un tracer deliberadamente pequeño: una identidad de trabajo, un slot de sucesor y un reemplazo de generación 0 a 1. No es un supervisor general.

stateDiagram-v2
[*] --> Generation0: trabajo aceptado
Generation0 --> ReplacementReserved: fallo de reemplazo
ReplacementReserved --> WakeIntent: un sucesor toma el slot
WakeIntent --> WakeDelivered: evidencia exacta del bus reconciliada
WakeDelivered --> Generation1: recibo consumido
Generation1 --> [*]: no hay segundo reemplazo

Un bucle general requiere elección de líder, leases, supresión de duplicados, delegación de autoridad y split brain. El tracer pregunta solo si una revisión aceptada puede producir un wake, sobrevivir a un envío ambiguo y publicar un recibo sin autoridad.

El almacén usa SQLite en modo WAL. Cada operación vincula su clave de idempotencia con la entrada exacta. Misma clave y entrada: resultado anterior. Misma clave y entrada distinta: OPERATION_CONFLICT.

Si replace-76 primero nombra la generación 1 y después la 2, reproducir el éxito previo ocultaría el desacuerdo. El controlador recibe el almacén mediante inyección; una versión anterior importaba SQLite directamente y la revisión devolvió esa dependencia a un puerto. La política pertenece al dominio, la base es un adaptador.

El camino conserva cuatro hechos: intención de wake, cursor/checkpoint anterior, envío idempotente exacto y hecho delivered reconciliado después del checkpoint. Si el bus acepta el mensaje pero se pierde la respuesta, el reintento busca la identidad exacta en vez de enviar a ciegas. La decisión exige entrega, no intención.

sequenceDiagram
participant C as Controlador de continuidad
participant S as Almacén de continuidad
participant B as Bus de Gaia
C->>S: guardar intención + digest
C->>B: capturar cursor
C->>S: guardar checkpoint
C->>B: enviar mensaje idempotente exacto
Note over C,B: la respuesta puede perderse aquí
C->>B: buscar identidad tras el checkpoint
B-->>C: cero o un evento duradero
C->>S: guardar hecho entregado

El recibo JSON contiene identidad, generaciones, evidencia del bus y digests. Su campo de autoridad está explícitamente vacío: continuidad transfiere contexto, no permiso para fusionar, desplegar, gastar o ampliar alcance.

Demerzel incluye el JSON Schema y fixtures y los valida en modo de solo lectura:

transición Gaia -> recibo portátil -> validación Demerzel -> entrada de gobernanza independiente

El recibo es el seam; compartir base o runtime destruiría la propiedad de cada repositorio.

Forma débil Fallo Invariante corregido
controlador importa persistencia el dominio depende de SQLite inyectar puerto del almacén
la intención basta un envío perdido parece entregado exigir evidencia de entrega
la clave siempre reproduce otra entrada hereda un éxito OPERATION_CONFLICT
prueba sin sidecar falta evidencia real del bus crear y comprobar el sidecar
escaneos y asignaciones repetidos aumenta el coste consultar una vez y reutilizar resultados acotados

La recuperación debe probar el éxito ambiguo, no solo el fallo limpio: el efecto quizá ocurrió y el código local todavía no lo sabe.

  • ningún fallback de pago sin autorización;
  • ningún reintento sobre el límite de intentos o dólares;
  • proveedor y modelo registrados en la evidencia;
  • proveedor no disponible = rechazo duradero o revisión humana;
  • un clasificador barato como Jev puede aconsejar routing, nunca probar entrega ni conceder efectos.

Evidencia medida del candidato — no de una release

Sección titulada «Evidencia medida del candidato — no de una release»

El 20 de septiembre de 2026, el candidato aislado ejecutó 2.261 pruebas Node: 2.259 pasaron, 0 fallaron, 2 se omitieron; regresión enfocada 87/87; verificador Gaia 37/37; verificador de arquitectura correcto. Demerzel ejecutó 787 pruebas Python con 1 omitida y 10/10 controles IXQL.

Estas mediciones están ligadas al commit Gaia 9a2f696, a su recibo de evidencia y al commit Demerzel fa04d7c. Los flujos locales de comandos no están versionados: repite las gates nombradas o usa los checks de las PR antes de tratar estas cifras como evidencia publicada.

Son mediciones de worktrees candidatos, no prueba de publicación, fusión, revisión del commit final o release.

  • R0 es un slot y un reemplazo, no un supervisor general.
  • Idempotencia vincula la entrada exacta; otra entrada es conflicto.
  • Un checkpoint previo permite reconciliar un resultado ambiguo.
  • El recibo transfiere evidencia de contexto con autoridad vacía.
  • Demerzel valida en solo lectura sin compartir estado.
  1. El bus acepta el wake y el proceso muere antes de la respuesta. ¿Por qué no basta «reintentar una vez»?
Solución

El primer envío puede ser duradero. El segundo crearía dos wakes. El checkpoint limita la búsqueda y la identidad exacta distingue el efecto del tráfico cercano.

  1. ¿Por qué autoridad vacía en vez de ausente?
Solución

Vacía afirma «sin autoridad». Ausente puede significar no modelada, desconocida u olvidada.