TL;DR: claude-fafm-sdk 1.1.1 ships Soul-Packet merge — a coordinator-free join so two offline .fafm souls converge. It’s a state-based CvRDT under a frozen encoding lock, checked by two independent implementations (N-version differential). Grow/update-only in v1 — we do not claim deletes converge.

# 30-second wow, zero install: uvx claude-fafm-sdk quickstart

Why mergeable matters

Hosted pull is a rendezvous: one living copy, everyone reads it. Portable memory also needs a packet mode — write once, send a soul, merge on arrival, no coordinator.

1.0 gave you offline etch / recall / INTEROP. 1.1 adds the lattice: a merge_souls(a, b) that is commutative, associative, and idempotent under logical equality. Sealed send (CRC packet) is next; the join has to be honest first.

What's New

  • merge_souls(a, b) — state-based CvRDT join: facts by id (field-level LWW + set-union tags/links), id-less G-Set, opaque maps, sessions G-Set, derived index rebuild.
  • MERGE.md — frozen merge spec + property oracle (public receipt surface).
  • WJTTC + N-version suites — C/A/I laws and a clean-room differential that must agree on every input.
  • Empty-timestamp pin"" is ABSENT at the Fact model so hashes and order stay deterministic (seal-ready later).

N-version: why two implementations

A single green test suite can prove “this code converges.” It cannot prove the spec is free of order bugs that only show under another encoding. So we froze the oracle first, then ran two independent merges against it. The differential caught a real footgun (empty-string timestamps) before production.

N-version differential: frozen oracle feeds two independent merge implementations that must converge to the same logical soul

Public framing stays method-first: two independent implementations converge under a frozen encoding lock — not a vendor endorsement story.

What kind of CRDT

Exact type: state-based CvRDT — a product of join-semilattices. Merge is the least-upper-bound over whole souls.

Soul merge as a product of join-semilattices: LWW fact map, G-Set id-less facts, max-registers, opaque LWW maps, sessions G-Set, derived index

Honesty bounds: grow/update-only. Offline delete sync is out of the packet path until tombstones. Sealed-packet send / CRC is the next volume — not claimed in 1.1.1.

Try It

# 30-second wow, zero install: uvx claude-fafm-sdk quickstart
# try the merge, ephemeral (no install): uv run --with claude-fafm-sdk python -c "from claude_fafm_sdk import merge_souls, Soul; a=Soul('@demo'); b=Soul('@demo'); b.etch('ships mergeable memory', id='why'); print(merge_souls(a,b).facts[0].text)"
# or classic: pip install claude-fafm-sdk==1.1.1

Full property suite (from source — tests are not inside the wheel):

git clone https://github.com/Wolfe-Jam/claude-fafm-sdk && cd claude-fafm-sdk git checkout v1.1.1 && uv pip install -e ".[dev]" pytest tests/test_wjttc_merge_crdt.py tests/test_nversion_differential.py

A reader who re-runs that suite is the public receipt. Private review transcripts stay private.

The Numbers

  • v1.1.1 — production (1.1.0 was TestPyPI staging only)
  • 14 + 19 — WJTTC merge laws + N-version differential tests
  • CvRDT — dual-implementation verified under encoding lock
  • PyPI: claude-fafm-sdk 1.1.1

Portable memory that merges. Star the SDK if it earns it.

Star claude-fafm-sdk