tawasuyu

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 15TOML 1358 Sutichaykuna

⎇ 6595dbed856eec31669beb6db74b456faa4be9a1 src/verdict.rs Rust · 43 siq'ikuna · 1.4 KB Ñawpa willay Pi imata llamkarqan ch'uya

M0/T0: scaffold del crate sheafsync 6595dbed8 · Sergio ·

1//! `verdict` — traducción del resultado topológico a lenguaje de sistemas (§6.5).
2//!
3//! `H¹ = 0 → corre libre` vs `H¹ ≠ 0 → coordina aquí`, con localización.
4
5use crate::cohomology::Cohomology;
6use crate::error::Result;
7use crate::nerve::ReplicaId;
8
9/// Un nudo: una obstrucción localizada entre réplicas/aristas concretas.
10#[derive(Debug, Clone, PartialEq)]
11pub struct Knot {
12    /// Réplicas implicadas en el nudo.
13    pub replicas: Vec<ReplicaId>,
14    /// Aristas del ciclo obstruido (índices en el nervio).
15    pub edges: Vec<usize>,
16}
17
18/// El veredicto final en lenguaje de sistemas.
19#[derive(Debug, Clone, PartialEq)]
20pub enum Verdict {
21    /// `H¹ = 0`: fusión libre de coordinación.
22    RunsFree,
23    /// `H¹ ≠ 0`: hace falta coordinar, con los nudos localizados.
24    NeedsCoordination {
25        /// Los nudos detectados.
26        knots: Vec<Knot>,
27    },
28}
29
30impl Verdict {
31    /// Deriva el veredicto a partir de la cohomología calculada.
32    ///
33    /// M0: cuando `dim_h1 == 0` devuelve `RunsFree`; la localización de nudos
34    /// (poblar `Knot` desde `obstruction_basis`) llega en T2/T3.
35    pub fn from_cohomology(cohomology: &Cohomology) -> Result<Verdict> {
36        if cohomology.dim_h1 == 0 {
37            Ok(Verdict::RunsFree)
38        } else {
39            // TODO(T2/T3): mapear obstruction_basis → Knot con réplicas y aristas.
40            Ok(Verdict::NeedsCoordination { knots: Vec::new() })
41        }
42    }
43}