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.

⎇ 67c1eb776f64dd43ab986286053d01f4fa8e7780 DISCREPANCIES.md Markdown · 91 líneas · 5.1 KB Historia crudo

T7: veredicto por difusión de Tarski y cierre de discrepancias 67c1eb776 · Sergio ·

1# Discrepancias haz ↔ oráculo CALM
2
3Registro de los casos donde el veredicto cohomológico **lineal** (`H¹`) **no**
4coincide con el oráculo CRDT/CALM. Como dice el SDD (§8, §11 R1), esto no es un
5bug a esconder: es el resultado científico del proyecto — dónde y por qué la
6Hipótesis H (§2.2) se rompe bajo la codificación lineal del MVP.
7
8> **ESTADO: RESUELTAS por la pista de retículos (Addendum, hito M-research).**
9> Las discrepancias del motor lineal quedan disueltas por la difusión del
10> Laplaciano de Tarski (§C–§F). Se mantienen documentadas abajo como control
11> histórico: el MVP lineal **sigue** discrepando (por diseño, es un detector
12> topológico barato), y Tarski **ya no**. Ese contraste es el punto científico.
13
14Reproducibles con `oracle::tests::discrepancias_del_lineal_persisten` (el lineal
15discrepa), `oracle::tests::tarski_resuelve_las_discrepancias_del_lineal` (Tarski
16coincide) y los casos de `oracle::casos_de_discrepancia()`.
17
18## Resumen
19
20| Caso | Oráculo (CALM) | Haz lineal (`H¹`) | Difusión de Tarski | Estado |
21|---|---|---|---|---|
22| `triangulo-monotono` | corre libre | `H¹ = 1` → coordina ❌ | corre libre ✅ | **RESUELTA** |
23| `cuadrado-monotono` | corre libre | `H¹ = 1` → coordina ❌ | corre libre ✅ | **RESUELTA** |
24| (general) dato **monótono** sobre grafo **cíclico** | corre libre | `H¹ = b₁ ≠ 0` ❌ | corre libre ✅ | **RESUELTA** |
25
26El MVP lineal **coincide** con el oráculo en todo el régimen de
27`oracle::casos_de_acuerdo()` (≥20 casos: sharing monótono acíclico y cualquier
28configuración no monótona). Tarski **coincide en toda la batería, sin excepción**,
29incluidos los cíclicos monótonos de arriba.
30
31## La discrepancia, en detalle
32
33**El caso.** Tres réplicas comparten un dato **monótono** (p.ej. un `GCounter`)
34en un triángulo: 0—1, 1—2, 2—0. Todas las operaciones son monótonas.
35
36**Qué dice CALM (oráculo).** Un `GCounter` se funde por máximo casilla a casilla;
37el join siempre existe y es único. No hay operación que retracte conocimiento,
38luego la configuración es **coordination-free**. El ciclo en el grafo de
39compartición es irrelevante: más caminos para difundir la misma información
40monótona no crean un conflicto.
41
42**Qué dice el haz.** La codificación lineal del MVP modela cada dato compartido
43como una restricción de **acuerdo** (identidad). Sobre el triángulo, el haz
44constante tiene `dim H¹ = b₁ = E − V + C = 3 − 3 + 1 = 1`. El motor reporta una
45obstrucción y pide coordinar.
46
47**Por qué ocurre (§2.3, R1).** La cohomología de haces es **lineal**; los
48retículos de los CRDTs son **de orden** (join-semilattices). Al aplanar el orden
49a álgebra lineal, el haz pierde la información de que la fusión monótona *siempre*
50pega las secciones locales. Lo que le queda es la topología pura del grafo, y la
51topología de un ciclo tiene `H¹ ≠ 0` con independencia de los datos. El haz
52"ve" así una obstrucción **topológica** donde CALM no ve ninguna **semántica**.
53
54Dicho de otro modo: bajo esta codificación, `H¹ = 0 ⟺ el grafo de compartición
55es acíclico`, un enunciado **puramente topológico** que solo coincide con CALM
56cuando el ciclo, de existir, transporta una operación no monótona (y por eso la
57codificación honesta añade un segundo enlace en conflicto solo en ese caso).
58
59## Consecuencia para la Hipótesis H
60
61En el **MVP lineal**, la Hipótesis H (`H¹ = 0 ⟺ coordination-free`) **se sostiene**
62para configuraciones cuyo sharing monótono es acíclico, y **falla** para datos
63monótonos sobre grafos cíclicos. La dirección que falla es conservadora: el haz
64pide coordinación de más (falsos positivos), nunca de menos. No se observó el
65fallo inverso (haz dice "libre" donde CALM dice "coordina").
66
67Bajo el **encoding de retículos con el Laplaciano de Tarski** (Addendum), la
68Hipótesis H pasa de "se sostiene solo en el caso acíclico" a **"se sostiene en
69general"**: la difusión reconcilia el dato monótono alrededor del ciclo sin
70colapsar, y solo colapsa a ⊤ ante una operación semánticamente incompatible (un
71`reset` que hace incomparables las generaciones). Verificado además por el
72invariante `proptest` "monótono sobre grafo arbitrario (cíclico incluido) ⟹
73corre libre", que el motor lineal *no podía* satisfacer.
74
75## Cómo se cerró (Addendum §B–§F, §2.3 / §11 Q2)
76
77Causa raíz: **la resta del coboundary** `(δx)_e = R·x_u − R·x_v`. Un
78join-semilattice no tiene inversos; al linealizarlo, `δ` mide desacuerdo-XOR e
79inventa obstrucciones-fantasma alrededor de los ciclos.
80
81La cura fue **eliminar la resta**: haces valuados en **retículos** con
82restricciones como **conexiones de Galois**, y el **Laplaciano de Tarski**
83(Ghrist–Riess 2022) difundido a punto fijo (Kleene/Tarski). El punto fijo es la
84mejor reconciliación coherente; corre libre si preserva lo local sin colapsar a ⊤.
85Ver `src/lattice.rs`, `src/tarski.rs` y `Verdict::via_tarski`.
86
87## Residuo abierto
88
89No se ha encontrado ningún caso donde **Tarski** y el oráculo discrepen. Si
90apareciera (p.ej. un CRDT que pida ya un *quantale*, R-L/Q-L1 del Addendum), ese
91residuo sería el siguiente resultado científico y se anotaría aquí.

DISCREPANCIES.md

Discrepancias haz ↔ oráculo CALM

Registro de los casos donde el veredicto cohomológico lineal (H¹) no coincide con el oráculo CRDT/CALM. Como dice el SDD (§8, §11 R1), esto no es un bug a esconder: es el resultado científico del proyecto — dónde y por qué la Hipótesis H (§2.2) se rompe bajo la codificación lineal del MVP.

ESTADO: RESUELTAS por la pista de retículos (Addendum, hito M-research). Las discrepancias del motor lineal quedan disueltas por la difusión del Laplaciano de Tarski (§C–§F). Se mantienen documentadas abajo como control histórico: el MVP lineal sigue discrepando (por diseño, es un detector topológico barato), y Tarski ya no. Ese contraste es el punto científico.

Reproducibles con oracle::tests::discrepancias_del_lineal_persisten (el lineal discrepa), oracle::tests::tarski_resuelve_las_discrepancias_del_lineal (Tarski coincide) y los casos de oracle::casos_de_discrepancia().

Resumen

CasoOráculo (CALM)Haz lineal (H¹)Difusión de TarskiEstado
triangulo-monotonocorre libreH¹ = 1 → coordina ❌corre libre ✅RESUELTA
cuadrado-monotonocorre libreH¹ = 1 → coordina ❌corre libre ✅RESUELTA
(general) dato monótono sobre grafo cíclicocorre libreH¹ = b₁ ≠ 0 ❌corre libre ✅RESUELTA

El MVP lineal coincide con el oráculo en todo el régimen de oracle::casos_de_acuerdo() (≥20 casos: sharing monótono acíclico y cualquier configuración no monótona). Tarski coincide en toda la batería, sin excepción, incluidos los cíclicos monótonos de arriba.

La discrepancia, en detalle

El caso. Tres réplicas comparten un dato monótono (p.ej. un GCounter) en un triángulo: 0—1, 1—2, 2—0. Todas las operaciones son monótonas.

Qué dice CALM (oráculo). Un GCounter se funde por máximo casilla a casilla; el join siempre existe y es único. No hay operación que retracte conocimiento, luego la configuración es coordination-free. El ciclo en el grafo de compartición es irrelevante: más caminos para difundir la misma información monótona no crean un conflicto.

Qué dice el haz. La codificación lineal del MVP modela cada dato compartido como una restricción de acuerdo (identidad). Sobre el triángulo, el haz constante tiene dim H¹ = b₁ = E − V + C = 3 − 3 + 1 = 1. El motor reporta una obstrucción y pide coordinar.

Por qué ocurre (§2.3, R1). La cohomología de haces es lineal; los retículos de los CRDTs son de orden (join-semilattices). Al aplanar el orden a álgebra lineal, el haz pierde la información de que la fusión monótona siempre pega las secciones locales. Lo que le queda es la topología pura del grafo, y la topología de un ciclo tiene H¹ ≠ 0 con independencia de los datos. El haz "ve" así una obstrucción topológica donde CALM no ve ninguna semántica.

Dicho de otro modo: bajo esta codificación, H¹ = 0 ⟺ el grafo de compartición es acíclico, un enunciado puramente topológico que solo coincide con CALM cuando el ciclo, de existir, transporta una operación no monótona (y por eso la codificación honesta añade un segundo enlace en conflicto solo en ese caso).

Consecuencia para la Hipótesis H

En el MVP lineal, la Hipótesis H (H¹ = 0 ⟺ coordination-free) se sostiene para configuraciones cuyo sharing monótono es acíclico, y falla para datos monótonos sobre grafos cíclicos. La dirección que falla es conservadora: el haz pide coordinación de más (falsos positivos), nunca de menos. No se observó el fallo inverso (haz dice "libre" donde CALM dice "coordina").

Bajo el encoding de retículos con el Laplaciano de Tarski (Addendum), la Hipótesis H pasa de "se sostiene solo en el caso acíclico" a "se sostiene en general": la difusión reconcilia el dato monótono alrededor del ciclo sin colapsar, y solo colapsa a ⊤ ante una operación semánticamente incompatible (un reset que hace incomparables las generaciones). Verificado además por el invariante proptest "monótono sobre grafo arbitrario (cíclico incluido) ⟹ corre libre", que el motor lineal no podía satisfacer.

Cómo se cerró (Addendum §B–§F, §2.3 / §11 Q2)

Causa raíz: la resta del coboundary (δx)_e = R·x_u − R·x_v. Un join-semilattice no tiene inversos; al linealizarlo, δ mide desacuerdo-XOR e inventa obstrucciones-fantasma alrededor de los ciclos.

La cura fue eliminar la resta: haces valuados en retículos con restricciones como conexiones de Galois, y el Laplaciano de Tarski (Ghrist–Riess 2022) difundido a punto fijo (Kleene/Tarski). El punto fijo es la mejor reconciliación coherente; corre libre si preserva lo local sin colapsar a ⊤. Ver src/lattice.rs, src/tarski.rs y Verdict::via_tarski.

Residuo abierto

No se ha encontrado ningún caso donde Tarski y el oráculo discrepen. Si apareciera (p.ej. un CRDT que pida ya un quantale, R-L/Q-L1 del Addendum), ese residuo sería el siguiente resultado científico y se anotaría aquí.