Su influencia: dos implementaciones que ya habían llegado solas
Sync9 y el Yjs modificado de Seph Gentle alcanzaron por su cuenta comportamientos que se conjeturan equivalentes a Fugue y a FugueMax, y el teorema de unicidad explica por qué esa coincidencia era previsible.
La forma habitual de medir la influencia de un artículo es contar quién lo adoptó después. Con Fugue esa cuenta se queda corta y además llega tarde, porque parte de su influencia es retrospectiva: cuando el artículo se publicó, ya existían dos implementaciones que nadie había demostrado correctas y en las que nadie había conseguido provocar una intercalación. Ninguna venía de la academia, ninguna tenía artículo asociado y ninguna conocía a la otra. Una es Sync9, un sincronizador entre pares del proyecto Braid; la otra es una modificación de Yjs publicada por Seph Gentle como código de referencia. El artículo las examina, conjetura que la primera es semánticamente equivalente a Fugue y la segunda a FugueMax, y toma prestada de esta última la técnica exacta que convierte a Fugue en FugueMax. Es una situación poco frecuente y muy reveladora: la teoría no llegó para corregir a la práctica sino para explicarla, para nombrar lo que ya funcionaba y para demostrar que no podía haber sido de otra manera. Esta lección cierra el nivel con esa historia, con lo que quedó abierto y con el porqué del puente hacia el nivel siguiente.
- Situar Sync9 y el Yjs modificado como implementaciones que precedieron a la formalización.
- Entender qué técnica concreta tomó FugueMax de una de ellas y por qué era la pieza que faltaba.
- Releer el teorema de unicidad como una predicción de convergencia entre implementadores independientes.
- Enumerar lo que el artículo deja explícitamente abierto y su relación con el nivel siguiente.
Dos implementaciones que ya habían llegado solas
Al construir la tabla de susceptibilidad a la intercalación, el artículo encuentra ejemplos de anomalía en casi todo lo publicado: en la familia de la transformación operacional y en la de los CRDT, en los algoritmos de identificadores densos y en los de árboles causales. Los únicos dos algoritmos existentes en los que no lograron encontrar ningún ejemplo de intercalación son Sync9, de Greg Little y Michael Toomim, y la modificación de Yjs propuesta por Seph Gentle en su repositorio de CRDT de referencia. Ambos son de 2021. De ninguno de los dos existía en aquel momento un artículo de investigación, ni una demostración de corrección, ni más documentación que el código fuente y unas notas informales.
Fugue se desarrolló con independencia de los dos. La relación se estableció después, al analizarlos, y quedó registrada en el artículo como dos conjeturas explícitas de equivalencia semántica.
CONJETURAS DE EQUIVALENCIA declaradas en el articulo
Sync9 equivalente a Fugue
Yjs modificado de Gentle equivalente a FugueMax
Si la segunda conjetura es cierta, entonces el Yjs modificado
es tambien maximalmente no intercalante, sin que su autor
dispusiera de la definicion ni de la demostracion.
Ambas quedan como trabajo futuro declarado. La primera se apoya
ademas en conversaciones con los autores de Sync9.
Vale la pena detenerse en qué significa exactamente que no existiera artículo. No es un juicio sobre la calidad del trabajo: Sync9 forma parte de un proyecto de sincronización entre pares con años de desarrollo y el código de referencia de Gentle es material didáctico ampliamente leído en el ecosistema. Significa otra cosa, más concreta y más incómoda: que nadie podía saber si esas implementaciones eran correctas más allá de que nadie hubiera conseguido romperlas. La ausencia de contraejemplos conocidos es evidencia, y es la clase de evidencia sobre la que se toman a diario decisiones de ingeniería perfectamente razonables, pero no es una garantía y no se puede transferir a otro sistema. La aportación del artículo a esas dos implementaciones no es corregirlas, es ofrecerles la posibilidad de que su comportamiento pase de estar bien probado a estar demostrado.
La deuda va en las dos direcciones y el artículo la reconoce con precisión. La diferencia entre Fugue y FugueMax —recorrer los hermanos del lado derecho en el orden inverso de sus orígenes derechos en lugar de por identificador— no es una invención de los autores: dicen literalmente que aprendieron esa técnica del Yjs modificado de Gentle, a quien además agradecen las conversaciones y los comentarios sobre un borrador. La pieza que separa quedarse cerca de la propiedad de demostrarla salió de una implementación práctica sin respaldo teórico.
// Orden de hermanos del lado derecho en FugueMax.
// La tecnica procede del Yjs modificado de Seph Gentle.
function compararHermanosDerechos(a, b, orden) {
const oa = orden.indiceDe(a.origenDerecho);
const ob = orden.indiceDe(b.origenDerecho);
if (oa !== ob) return ob - oa; // orden inverso de los origenes derechos
return a.id < b.id ? -1 : 1; // desempate por identificador
}
Por qué la coincidencia no era casual
Resulta tentador leer todo esto como una anécdota simpática sobre la sabiduría del código abierto. Es bastante más que eso, y el teorema de unicidad de la segunda lección es la razón. Aquel resultado dice que cualquier algoritmo maximalmente no intercalante produce el mismo orden total que FugueMax, sin ninguna libertad restante salvo el desempate arbitrario entre elementos con ambos orígenes idénticos. Léelo ahora al revés, como enunciado sobre las personas y no sobre los algoritmos: si dos implementadores persiguen la misma intuición y ambos aciertan, están obligados a converger al mismo comportamiento, porque el espacio de comportamientos aceptables tiene exactamente un elemento.
flowchart TD K19[2019 PaPoC nombra la anomalia y su definicion resulta insatisfacible] --> F23[2023 Fugue y FugueMax] S21[2021 Sync9 sin articulo ni demostracion] -.conjetura de equivalencia.-> F23 G21[2021 Yjs modificado de Gentle sin articulo] -.tecnica del origen derecho invertido.-> F23 F23 --> T10[teorema de unicidad, solo existe un orden admisible] T10 --> EXPL[explica la convergencia independiente de las implementaciones] F23 --> COL[la implementacion optimizada se adopta en Collabs 0.6.1] F23 --> AB[queda abierto si existe una OT maximalmente no intercalante] F23 --> PUB[2025 IEEE Transactions on Parallel and Distributed Systems] style T10 fill:#a6e3a1,color:#11111b style AB fill:#fab387,color:#11111b
Puesto en una tabla, el estado de la familia en el momento de la publicación deja ver con claridad quién tiene qué.
LOS CUATRO ALGORITMOS EMPARENTADOS Y SU ESTADO
Fugue
articulo publicado, demostracion de la especificacion fuerte,
se queda ligeramente por debajo de la maximalidad,
implementacion optimizada y adoptada por una biblioteca
FugueMax
articulo publicado, demostracion completa de maximalidad,
solo implementacion directa, mas metadatos por nodo derecho
Sync9
codigo fuente y notas informales, sin articulo ni demostracion,
se conjetura semanticamente equivalente a Fugue
Yjs modificado de Gentle
codigo de referencia, sin articulo ni demostracion,
se conjetura semanticamente equivalente a FugueMax,
aporto la tecnica del origen derecho invertido
De ahí se sigue algo que conviene interiorizar sobre el valor de las conjeturas de equivalencia. No son un cumplido a Sync9 ni a Gentle: son evidencia empírica de que la propiedad captura algo real. Si la no intercalación maximal fuera una preferencia estética de sus autores, no habría ninguna razón para que dos implementadores ajenos, trabajando por separado sobre casos de uso concretos y sin ningún marco formal, hubieran aterrizado en el mismo comportamiento. Que lo hicieran sugiere que la definición no inventó un criterio, sino que puso nombre a la única solución que ya existía y a la que se llega desde cualquier punto de partida razonable.
Conjeturar que dos algoritmos son semánticamente equivalentes no es decir que se parezcan ni que compartan estructura. Es afirmar que, en cualquier ejecución concebible, producen el mismo orden total sobre los elementos. Demostrarlo permite algo muy concreto y muy valioso: transferir de golpe todas las propiedades demostradas de uno al otro. Si se demuestra que el Yjs modificado es equivalente a FugueMax, ese Yjs modificado pasa a ser maximalmente no intercalante sin escribir una sola demostración nueva sobre él, y su implementación, ya madura y probada en producción, hereda la garantía completa. Es la vía más barata que existe para dotar de fundamento formal a un sistema que ya funciona.
Lo que se adoptó y lo que quedó abierto
El recorrido del trabajo desde su publicación como preimpresión en abril de 2023 hasta su aparición en IEEE Transactions on Parallel and Distributed Systems en noviembre de 2025 deja un balance con partes cerradas y partes explícitamente sin cerrar.
Adopción directa
La implementación optimizada de Fugue se publicó en abierto y la biblioteca Collabs la usa para sus CRDT de listas desde la versión 0.6.1.
Convergencia previa
Sync9 y el Yjs modificado ya se comportaban de forma que se conjetura equivalente, de modo que parte del ecosistema cumplía la propiedad antes de que existiera.
Criterio de evaluación
La propiedad y su teorema de unicidad se convierten en el patrón contra el que medir cualquier algoritmo de listas posterior, incluidos los que aún no existen.
La pregunta sobre la OT
Queda abierto si existe algún algoritmo de transformación operacional maximalmente no intercalante, un problema que el artículo plantea sin resolver.
El recorrido editorial tampoco es un detalle irrelevante. La preimpresión apareció en abril de 2023, tuvo una segunda versión en noviembre de ese mismo año y una tercera en octubre de 2025, y el artículo se publicó en la revista en noviembre de 2025. Dos años y medio entre la primera versión pública y la definitiva, sobre un trabajo cuya parte delicada son demostraciones. Ese calendario dice algo sobre la naturaleza de lo que se está publicando: una propiedad de corrección con un teorema de unicidad detrás no se revisa como se revisa una mejora de rendimiento, porque un error en una demostración invalida el enunciado entero y no solo una cifra. Mientras tanto, la implementación estaba disponible en abierto y ya integrada en una biblioteca, de modo que la práctica corrió por delante de la validación formal también en esta última etapa.
La utilidad inmediata de todo el nivel cabe en cuatro preguntas que ahora puedes formular con precisión y que antes no tenían respuesta comprobable. Primera: cuando dos personas escriben a la vez en el mismo punto, ¿los bloques quedan contiguos, y está eso demostrado o solo probado? Segunda: ¿qué ocurre cuando la escritura es hacia atrás, es decir cuando se antepone repetidamente al principio de una lista, que es el caso habitual en gestores de tareas y hojas de cálculo? Tercera: ¿la identidad de réplica sobrevive a una recarga de pestaña, o cada refresco fabrica una réplica nueva y te coloca en el escenario multirréplica? Y cuarta: el tiempo de carga del documento guardado, ¿está medido sobre una traza real de tecleo o sobre inserciones sintéticas? Las cuatro se pueden contestar leyendo documentación y midiendo, y las cuatro separan a las bibliotecas que han pensado el problema de las que no.
Las tareas pendientes que el propio artículo enumera son tres y conviene tenerlas presentes porque delimitan lo que aún no está demostrado. Primera: analizar formalmente Sync9 y convertir la conjetura de equivalencia con Fugue en un teorema. Segunda: hacer lo mismo con el Yjs modificado respecto a FugueMax, lo que trasladaría la maximalidad a una implementación ampliamente usada. Tercera, y la más ambiciosa: averiguar si la familia de la transformación operacional puede alcanzar la misma propiedad, cuestión nada obvia porque esos algoritmos operan bajo un modelo de sistema distinto, con un servidor que secuencia, y la definición está formulada en términos de orígenes y de concurrencia causal.
El puente con el nivel siguiente
Hay una manera precisa de describir qué deja resuelto este trabajo y qué no, y es la que explica por qué el nivel siguiente pertenece a la misma línea. Fugue cierra la pregunta semántica: dado un historial de ediciones concurrentes, cuál es el orden correcto del documento resultante. La cierra del todo, no parcialmente, porque el teorema de unicidad demuestra que la respuesta admisible es única. Lo que no toca es la pregunta de la representación: cómo se almacena ese historial, cómo se transmite, cómo se reproduce desde cero y cuánto cuesta reconstruir el documento a partir de él.
La tercera pregunta abierta, la de la transformación operacional, merece un comentario porque su dificultad es de naturaleza distinta y no meramente técnica. La definición de no intercalación maximal está formulada en términos de orígenes izquierdo y derecho y de la relación de concurrencia causal entre inserciones, es decir, en el vocabulario nativo de los CRDT. Un algoritmo de transformación operacional no manipula identificadores de elementos sino índices, y los ajusta al recibir operaciones ajenas; su modelo de sistema habitual incorpora además un servidor que secuencia. Traducir la propiedad a ese marco no es aplicar una definición existente, es reconstruirla, y no está claro de antemano que la traducción conserve el significado. Como la transformación operacional sigue siendo la base de los editores colaborativos más usados del mundo, la respuesta a esa pregunta tiene un alcance práctico considerable.
Esa segunda pregunta no era urgente mientras la primera estuviera abierta, porque no tiene sentido optimizar la representación de un resultado que todavía no sabes si es el correcto. En cuanto la semántica queda fijada por un teorema, toda la presión de investigación se desplaza hacia la representación, y ahí es donde se sitúa el trabajo del nivel siguiente: misma familia de problemas, mismos autores en parte, mismas trazas de referencia para medir y mismas bibliotecas como línea de base, pero con la atención puesta en cómo guardar y reproducir el historial en lugar de en qué orden produce al fusionarse. Leídos en ese orden, los dos niveles cuentan una sola historia en dos actos: primero se decide cuál es la respuesta correcta y después se discute cuánto cuesta darla.
Conviene terminar el nivel con una observación sobre cómo se reconoce el impacto real de un resultado teórico, porque el criterio habitual —cuánta gente lo cita, cuántos productos lo anuncian— falla justo en los casos más importantes. Un algoritmo influyente se nota: aparece su nombre en los ficheros de dependencias y en las notas de versión. Una propiedad de corrección influyente hace lo contrario, desaparece dentro de las expectativas. Nadie va a anunciar que su editor colaborativo es maximalmente no intercalante, del mismo modo que nadie anuncia que su base de datos no corrompe las filas al escribirlas: se convierte en el suelo, en lo que se da por supuesto, y su presencia solo se percibe cuando falta. Fíjate en la asimetría que eso produce en la carrera de un resultado. El artículo tuvo que dedicar su sección más laboriosa a documentar anomalías en una docena de algoritmos previos, es decir, a demostrar que el problema existía, porque el problema era invisible precisamente por no estar en ninguna especificación. Si el trabajo tiene éxito completo, dentro de una década nadie tendrá que hacer ese esfuerzo: la propiedad estará en las suites de pruebas de las bibliotecas, los algoritmos que la incumplan sencillamente no se publicarán, y la anomalía que aquí hemos estudiado en detalle será una curiosidad histórica que ya no se puede reproducir en ningún sistema vivo. Y hay una consecuencia práctica que va directamente al trabajo de quien construye software local-first, más allá de la edición de texto. Las propiedades que valen la pena escribir no son las que suenan impresionantes, sino las que, una vez enunciadas, hacen que la pregunta correspondiente deje de plantearse. La convergencia hizo eso en su día con la coherencia entre réplicas y hoy nadie discute si su CRDT converge, se asume. La no intercalación maximal aspira a hacer lo mismo con la legibilidad del resultado fusionado. Cuando estés tentado de resolver un problema recurrente con un parche más, pregúntate cuál es la propiedad que, de existir, haría que el problema no volviera a aparecer nunca; y luego pregúntate si tienes la paciencia de enunciarla bien, encontrar el punto donde se vuelve insatisfacible, y ajustarla hasta que sea a la vez exigente y alcanzable. Ese trabajo es lento, no produce demostraciones espectaculares y casi nunca se agradece. Es también, según muestra este nivel entero, el único que cierra preguntas en lugar de administrarlas.
- Implementa Fugue y FugueMax en la misma base de código y construye un generador de ejecuciones aleatorias con concurrencia real entre varias réplicas.
- Compara los órdenes finales de ambos y estima empíricamente con qué frecuencia difieren en trazas parecidas a la edición humana.
- Añade una implementación de un CRDT de listas que uses en producción y comprueba si su orden coincide con el de FugueMax en cada ejecución generada.
- Cuando encuentres una discrepancia, redúcela a la ejecución mínima que la provoca y clasifícala como intercalación hacia delante, hacia atrás o desempate.
- Escribe la comprobación de las tres condiciones de la definición como una prueba basada en propiedades e incorpórala a tu suite habitual.
- Documenta en una página qué le garantizas a tus usuarios sobre las ediciones concurrentes, y comprueba que cada frase de esa página tiene detrás una prueba que la respalda.