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.
M0/T0: scaffold del crate sheafsync
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}