Ctrl K
ComunidadGuías…

examples/14_federation.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""Example 14 — CRDT federation: two fabrics, one converged memory.

What this shows:
  * node A and node B each ingest DIFFERENT conversations locally (μ=0);
  * a partition-tolerant sync exchanges HMAC-signed digest/delta
    envelopes (here over an in-memory mesh; the file transport does the
    same offline via outbox/inbox spool dirs);
  * both fabrics converge to the byte-exact same memory state —
    no coordinator, no locks, delivery order irrelevant;
  * a retraction on one side propagates and survives the merge.

Requires nothing beyond the core package (pure Python CRDT).
"""

import datetime as dt

from cortexm import Memory
from cortexm.federation import (
    InMemoryMesh,
    apply_to_store,
    node_from_store,
)

TS = dt.datetime(2026, 1, 10, tzinfo=dt.timezone.utc)

# --- two independent fabrics (imagine two edge devices) --------------------
a = Memory()
a.add([{"role": "user", "content":
        "I'm Alice. I work at Acme Corp on the storage team, "
        "and we deploy everything on Kubernetes.", "timestamp": TS}])

b = Memory()
b.add([{"role": "user", "content":
        "Bob here — I live in Oslo, prefer Rust over C++, "
        "and my team runs Postgres 16 in production.", "timestamp": TS}])

# --- wrap both in federation nodes ------------------------------------------
na = node_from_store("edge-a", a.store, members=["edge-a", "edge-b"],
                     federation_key="demo-key")
nb = node_from_store("edge-b", b.store, members=["edge-a", "edge-b"],
                     federation_key="demo-key")

print("before sync:",
      "A knows", len(a.store.active_facts()), "facts |",
      "B knows", len(b.store.active_facts()), "facts")

# --- sync (in-memory mesh; FileTransport does the same offline) ------------
mesh = InMemoryMesh()
mesh.link("edge-a", "edge-b")
mesh.gossip({"edge-a": na, "edge-b": nb}, rounds=2)
print("byte-exact convergence:", na.converged_with(nb))

# --- write the converged state back into both fabrics -----------------------
apply_to_store(na, a.store)
apply_to_store(nb, b.store)
va = {(f.subject, f.relation, f.value)
      for f in a.store.active_facts()}
vb = {(f.subject, f.relation, f.value)
      for f in b.store.active_facts()}
print("both fabrics see the same world:", va == vb)
print("  A's view:", sorted(va)[:4], "...")

# --- a GDPR-style retraction on one side, then re-sync ----------------------
node_a2 = node_from_store("edge-a", a.store, members=["edge-a", "edge-b"],
                          federation_key="demo-key")
node_b2 = node_from_store("edge-b", b.store, members=["edge-a", "edge-b"],
                          federation_key="demo-key")
for f in node_a2.state.keys():
    if "\x1falice\x1f" in f.lower():
        node_a2.retract(f, purge=True)          # poison-pill erase
node_a2.sync_with(node_b2)
print("after purge sync, converged:", node_a2.converged_with(node_b2))

a.close()
b.close()
print("\nnext: context_m/federation/transport.py FileTransport — the same")
print("envelopes as JSONL spool files your rsync/git/USB 'mule' moves.")