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 quickstartWhy 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.

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.

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.1Full 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.pyA 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