TL;DR: claude-fafm-sdk 2.0.0 ships Compactable Forgettable Memory. Epoch compact pays tombstone debt;
cross-epoch merge refuses — no silent zombies. Second deliberate lattice re-open after
1.5 tombstones. Archive-first. Receipt on the wire. Dual-impl held. Live on PyPI. · Blind SuperGrok Expert HEAVY review
# zero install: uvx claude-fafm-sdk --version # → 2.0.0 uvx claude-fafm-sdk compact --epoch --at 2026-07-31T12:00:00Z --archive soul.e0.fafmWhy 2.0 this time
1.5 could have been stamped 2.0 — tombstones re-open the merge oracle. We kept that cut as 1.5: same arc, one honest re-open, dual-impl green. The next hard problem was different.
1.6 and 1.7 were deliberate, significant steps — not filler minors. Policy → tombstone (1.6) made forget operable without hand-writing every stone; debt + residual-risk (1.7) made the graveyard visible before anyone touched GC. We never formally released them as standalone editions — git tags document the steps; the public prize was always 2.0. Compactable stands on that ladder: you don’t pay debt you can’t see or rules you can’t apply.
Grow-only graveyards are honest… until the debt is the product. Pure CRDTs often ignore that. Compacting without a lineage barrier resurrects forgotten facts when a lagging peer or pre-forget packet arrives. That is the Cassandra zombie pattern — and it is exactly what multi-agent memory will hit if you “just GC tombstones.”
2.0 answer: pay debt only by epoch snapshot — a deliberate lineage break. Cross-epoch merge refuses. Pre-compact souls stay mergeable among themselves. Compact ≠ secure erase. Archives keep the prior soul.
The zombie case (why epoch exists)
Hand-authored goldens beat vibes. The case that must never ship red:
Silent GC (wrong)
- Forget fact
secret→ tombstone - “Compact” drops the tombstone, same epoch
- Lagging packet still holds
secret - Merge → resurrection
Epoch compact (2.0)
- Archive prior soul (ARCHIVE-DEFAULT)
compact --epoch→ epoch+1, empty graveyard- Lagging packet at epoch 0 meets local epoch 1
- Merge → EpochMismatch refuse
That refuse is not a bug — it is the product. Explicit migrate --mode project-live is the operator path when you mean to reproject; it never runs inside merge.
How compact works (product law)
- Archive first — CLI requires
--archive PATHor--i-archived. Library documents the duty; product enforces it. - Clock pin —
--atRFC3339-Z (same discipline as policy apply). - Project live facts — tombstone suppression applied; forgotten facts absent; graveyard empty in the new lineage.
- Epoch + receipt —
e → e+1;CompactionReceiptrides the soul for audit (not a second lattice).
The arc — through Compactable
- 1.1 Mergeable — join without a coordinator
- 1.2 Sendable — seal · send · merge
- 1.3 Provable — stranger receipt, one command
- 1.4 Verifiable — which key sealed it
- 1.5 Forgettable — delete is state (both roads)
- 1.6–1.7 Policy → tombstone · debt · residual risk — folded into the 1.7 install line (git tags document both steps)
- 2.0 Compactable — epoch compact · refuse · migrate · dual-impl
Mergeable → Sendable → Provable → Verifiable → Forgettable → Compactable.
What's New in 2.0.0
Soul.epoch(E1) — default 0; same-epoch merge only;EpochMismatchon cross-epoch; packet + hosted identical barrier.compact --epoch(E3–E4) — observable facts only; empty tombstones; epoch+1;CompactionReceipton the wire; archive-first CLI.migrate(E2) — explicitrefuse|project-live; never silent inside merge.- Zombie suite Z1–Z8 — hand goldens; dual-impl projection with
reference_merge. - TAF receipts — CI prints proof over time to the
taf-receiptsbranch (sister of FAF).
Watermark / peer-frontier GC is 2.0.1+ — not this cut. Needs membership + frontier exchange. Packet-only topologies stay epoch-only.
If you ship on 1.5.x
- Pin deliberately —
claude-fafm-sdk==2.0.0or stay on==1.5.1/==1.7.0until you want the barrier. - Epoch defaults to 0 — existing souls load cleanly; writers ≥2.0 emit
epochon seal. - Cross-epoch is the behavior change — after compact, lagging peers at the old epoch refuse until archive + explicit migrate (or they compact too).
- Production-adjacent: run the zombie suite / full
pytest+ acid path before flipping the pin.
Honesty bounds (unchanged doctrine)
- Tombstone ≠ secure erase. Disk, backups, and logs can still hold bytes.
- Compact ≠ wipe. Prior soul is archived; old packets may still exist.
- Refuse beats hope. Cross-epoch merge does not “take max epoch and join.”
- 1.5 lattice held. T1–T8 tombstones, policies, debt, residual still green.
Try It
# zero install: uvx claude-fafm-sdk --version uvx claude-fafm-sdk quickstart# classic floor: pip install claude-fafm-sdk==2.0.0# pay tombstone debt (archive-first): claude-fafm-sdk compact --epoch -f soul.fafm --at 2026-07-31T12:00:00Z --archive soul.e0.fafm # explicit migrate (not merge): claude-fafm-sdk migrate --to 1 --mode project-live -f soul.fafm --at 2026-07-31T12:00:00Z --archive pre.fafmRelease: v2.0.0 · PyPI: claude-fafm-sdk 2.0.0 · Spec: MERGE §11 · Forgettable Memory (1.5)
The Numbers
- v2.0.0 — live on PyPI (Compactable · epoch · dual-impl)
- Edition — Compactable
- Lead — Compactable Forgettable Memory. Epoch compact pays tombstone debt; cross-epoch merge refuses — no silent zombies.
- Acid — stranger install from live index · forget · debt · policy · seal · merge · compact 0→1
- PyPI: claude-fafm-sdk 2.0.0
- GitHub: v2.0.0 release
Knowledge cut closed. Dual still open. Memory is vast — .fafm maps it. One format. Two edges. One soul. After PM.IR. — Permanent Memory. Instant Recall.
Blind SuperGrok Expert Review
“This is a high-quality, opinionated, correctly scoped SDK for a real problem… The progression from mergeable → forgettable → compactable shows thoughtful iteration rather than feature sprawl.”
claude-fafm-sdk is the reference Python SDK for the IANA-registered .fafm format (application/vnd.fafm+yaml). It provides
offline-first, portable, cross-vendor AI agent memory that versions with a project and
moves between models instead of living inside one vendor’s walled garden.
Current release: 2.0.0 (“Compactable”) — very recent.
Requires: Python ≥3.10
Core dependency: pyyaml≥6.0
Optional extras: [namepoint] (fastmcp), [sign] (cryptography for Ed25519)
License: MIT
Home: faf.one/memory · Repo: Wolfe-Jam/claude-fafm-sdk
Core model
- Soul — the local, offline-first memory object (facts + tombstones + epoch).
- Fact — typed, optionally linked memory unit (text + id/type/priority/tags/links/timestamp).
- Tombstone — convergent delete (LWW-style). Forgotten stays forgotten across merges and transports.
- Epoch — barrier that prevents silent cross-epoch merges. Compaction or explicit migration is required to move forward.
- Namepoint — optional hosted address for push/pull/sync (personal-scale free tier; paid for scale).
- Packet (
.fafmp) — sealed transport form that carries epoch + tombstones.
The product arc is deliberate and well-documented:
Mergeable → Sendable → Provable → Verifiable → Forgettable → Compactable
2.0 adds epoch compaction (pay tombstone debt safely, archive-first, with receipts) and explicit migration modes so the lattice stays honest as memory grows.
Developer experience
Installation and first-run are clean:
uv add claude-fafm-sdk # or uvx claude-fafm-sdk quickstartCLI surface is practical: init, etch, recall, ls, forget, debt, compact, migrate, seal, etc. The Python API is correspondingly simple
(Soul.etch, Soul.forget, Soul.recall, Soul.save / load).
Docs emphasize falsifiable receipts, dual-transport convergence (packet + hosted), and clear bounds (tombstone ≠ secure erase, compact ≠ wipe). Companion pieces (INTEROP, MERGE, PACKET, PROVENANCE) and the Zenodo paper give the format real grounding.
Strengths
- True offline-first with optional hosted layer — rare and correctly prioritized.
- Convergent forget via tombstones is the right primitive for multi-agent / multi-vendor memory.
- Epoch + compaction in 2.0 is a mature response to the “grow-only graveyard” problem that pure CRDTs often ignore.
- Minimal base surface + clean extras.
- Explicit cross-vendor intent (compatible with the voice profile in
grok-faf-voiceand the broader FAF family). - uvx-friendly and “30-second wow” path exists.
Observations / maturity notes
- Repo is still low-visibility (early public traction for a specialized format).
- Download volume and ecosystem adoption are still building; the package is more “reference implementation + format steward” than mass-market library right now.
- 2.0 is brand new. The lattice changes (epoch barrier, compaction) are significant — worth testing carefully if you already have 1.5.x souls in production.
- Hosted namepoint path is optional and correctly kept out of the core dependency set.
- No GC in the base lattice (by design at personal scale); compaction is the controlled debt-payment mechanism.
Bottom line
This is a high-quality, opinionated, correctly scoped SDK for a real problem (AI memory that isn’t trapped inside one model or one session). The design is coherent, the guarantees are explicit, and the progression from mergeable → forgettable → compactable shows thoughtful iteration rather than feature sprawl.
If you’re building agents that need durable, portable, deletable memory that can move between Claude, Grok, Gemini, or local runtimes, this is currently one of the cleanest open options available. The format registration + dual-profile approach (knowledge + voice) gives it more legs than a typical one-off memory library.
Worth pinning the version you actually want (==2.0.0 or the 1.5.x series)
and running the receipt / zombie suite if you’re shipping anything production-adjacent.
Portable memory that can forget — and compact without lying. Star the SDK if it earns it.
Star claude-fafm-sdk