gioser

tawasuyu/hifas

Motor en Rust para decidir, con demostración y no a ojo, cuándo un conjunto de réplicas local-first puede operar sin coordinación y cuándo no — y, cuando la respuesta es "sí, dentro de límites", proveer el mecanismo que lo garantiza.

Rust 24Markdown 14TOML 1358 Definiciones

⎇ 9de0cc601fd2eb7b9cf9b8a26ef8ed1ac1c9cd8d FLIPS.md Markdown · 70 líneas · 3.1 KB Historia crudo

T8a: encoding desde el orden nativo — mata la circularidad de T5-T7 b666de794 · Sergio ·

1# FLIPS — de-circularización de T5–T7 (T8a)
2
3Registro de los veredictos que **cambian** al pasar del encoding de retículo de
4T5–T7 (circular) al **orden nativo derivado del merge** (T8a, Addendum §B).
5
6Cada flip es una confesión: ahí el veredicto de la pista de retículos no venía de
7la semántica del dato, sino de una incomparabilidad **fabricada a mano** leyendo
8la etiqueta monótono/reset.
9
10Reproducible con `oracle::tests::t8a_el_orden_nativo_voltea_los_resets`.
11
12## La causa (T8 §A)
13
14El encoding de T7 sembraba `ResetVal` con `generación = componente del subgrafo
15monótono`. Eso **lee la etiqueta** `monotone`/`reset` — la misma información que
16usa CALM — y con ella construye la incomparabilidad que hacía colapsar los reset
17a ⊤. Acuerdo perfecto con CALM, sí, pero por circularidad: un espejo, no un
18teorema.
19
20## La cura (T8 §B)
21
22El orden se deriva ahora **mecánicamente del merge**, sin tocar la etiqueta:
23
24```
25join(a, b) := merge_del_CRDT(a, b)
26a ≤ b      := ( merge(a, b) == b )
27```
28
29Bajo este orden, el registro con reset (LWW: gana la generación mayor) es una
30**cadena** totalmente ordenada. En una cadena la difusión siempre reconcilia al
31máximo → **corre libre**. El reset NO colapsa: un LWW-register es un CRDT, y los
32CRDT son libres de coordinación por construcción.
33
34## Flips observados (8)
35
36Todos en la misma dirección: `coordina` (T7 circular) → `corre libre` (T8a nativo).
37Ninguno al revés.
38
39| Caso | T7 (circular) | T8a (nativo) |
40|---|---|---|
41| `par-no-monotono` | coordina | **corre libre** |
42| `camino-con-reset-en-0` | coordina | **corre libre** |
43| `camino-con-reset-en-1` | coordina | **corre libre** |
44| `camino-con-reset-en-2` | coordina | **corre libre** |
45| `dos-resets-separados` | coordina | **corre libre** |
46| `estrella-con-reset` | coordina | **corre libre** |
47| `arbol-con-reset` | coordina | **corre libre** |
48| `todo-reset` | coordina | **corre libre** |
49
50Los casos puramente monótonos (`camino-monotono-*`, `estrella-monotona`,
51`triangulo-monotono`, `cuadrado-monotono`, …) **no** cambian: ya corrían libres, y
52siguen corriendo libres — ahora por la razón correcta (su merge reconcilia), no
53por topología ni por etiqueta.
54
55## Lectura honesta
56
57El veredicto `coordina` que T5–T7 daba al reset era **artificial**. Bajo el orden
58nativo, todo CRDT puro corre libre en cualquier grafo, ciclos incluidos
59(`oracle::tests::nativo_todo_crdt_puro_corre_libre`). Eso es correcto y es
60incómodo: significa que la pista de retículos, tal como estaba, **no medía nada
61que CALM no midiera** — de hecho, medía la etiqueta que le dábamos.
62
63La obstrucción real no vive en el tipo de dato; vive en un **invariante global**
64que la fusión no preserva (saldo ≥ 0, unicidad de ID). Ese es el objeto de T8c, y
65el único sitio donde puede aparecer la "discrepancia buena" (Tarski libre / CALM
66sintáctico coordina) que probaría que el instrumento es más fino que un check
67por-programa — el marco es *invariant confluence* (Bailis et al. VLDB 2014).
68
69Hasta cerrar T8c (`STRONG_RESULT.md`), la conclusión honesta es: **versión débil
70no descartada**; el haz podría estar colapsando a CALM.

FLIPS.md

FLIPS — de-circularización de T5–T7 (T8a)

Registro de los veredictos que cambian al pasar del encoding de retículo de T5–T7 (circular) al orden nativo derivado del merge (T8a, Addendum §B).

Cada flip es una confesión: ahí el veredicto de la pista de retículos no venía de la semántica del dato, sino de una incomparabilidad fabricada a mano leyendo la etiqueta monótono/reset.

Reproducible con oracle::tests::t8a_el_orden_nativo_voltea_los_resets.

La causa (T8 §A)

El encoding de T7 sembraba ResetVal con generación = componente del subgrafo monótono. Eso lee la etiqueta monotone/reset — la misma información que usa CALM — y con ella construye la incomparabilidad que hacía colapsar los reset a ⊤. Acuerdo perfecto con CALM, sí, pero por circularidad: un espejo, no un teorema.

La cura (T8 §B)

El orden se deriva ahora mecánicamente del merge, sin tocar la etiqueta:

join(a, b) := merge_del_CRDT(a, b)
a ≤ b      := ( merge(a, b) == b )

Bajo este orden, el registro con reset (LWW: gana la generación mayor) es una cadena totalmente ordenada. En una cadena la difusión siempre reconcilia al máximo → corre libre. El reset NO colapsa: un LWW-register es un CRDT, y los CRDT son libres de coordinación por construcción.

Flips observados (8)

Todos en la misma dirección: coordina (T7 circular) → corre libre (T8a nativo). Ninguno al revés.

CasoT7 (circular)T8a (nativo)
par-no-monotonocoordinacorre libre
camino-con-reset-en-0coordinacorre libre
camino-con-reset-en-1coordinacorre libre
camino-con-reset-en-2coordinacorre libre
dos-resets-separadoscoordinacorre libre
estrella-con-resetcoordinacorre libre
arbol-con-resetcoordinacorre libre
todo-resetcoordinacorre libre

Los casos puramente monótonos (camino-monotono-*, estrella-monotona, triangulo-monotono, cuadrado-monotono, …) no cambian: ya corrían libres, y siguen corriendo libres — ahora por la razón correcta (su merge reconcilia), no por topología ni por etiqueta.

Lectura honesta

El veredicto coordina que T5–T7 daba al reset era artificial. Bajo el orden nativo, todo CRDT puro corre libre en cualquier grafo, ciclos incluidos (oracle::tests::nativo_todo_crdt_puro_corre_libre). Eso es correcto y es incómodo: significa que la pista de retículos, tal como estaba, no medía nada que CALM no midiera — de hecho, medía la etiqueta que le dábamos.

La obstrucción real no vive en el tipo de dato; vive en un invariante global que la fusión no preserva (saldo ≥ 0, unicidad de ID). Ese es el objeto de T8c, y el único sitio donde puede aparecer la "discrepancia buena" (Tarski libre / CALM sintáctico coordina) que probaría que el instrumento es más fino que un check por-programa — el marco es invariant confluence (Bailis et al. VLDB 2014).

Hasta cerrar T8c (STRONG_RESULT.md), la conclusión honesta es: versión débil no descartada; el haz podría estar colapsando a CALM.