Portable Pack Capsules¶
openclaw-mem can package a governed pack into a small portable capsule without pretending that the capsule is the new source of truth.
This is the memvid-inspired line we chose to adopt: - keep portability - keep receipts - keep provenance/trust governance outside the capsule itself
Why this exists¶
A portable capsule is useful when you want to: - move a bounded pack between hosts - archive a specific recall result with integrity checks - compare a past capsule against a current governed store - produce a small audit artifact instead of replaying a whole retrieval live
What it is not:
- not a replacement for openclaw-mem storage/governance
- not a merge engine
- not a live-target restore/migration lane
Commands¶
1) Seal a capsule¶
DB=/tmp/openclaw-mem-proof.sqlite
OUT=/tmp/openclaw-mem-capsules/trust-aware-demo
openclaw-mem capsule seal \
--db "$DB" \
--query "trust-aware context packing prompt pack receipts hostile durable memory provenance" \
--pack-trust-policy exclude_quarantined_fail_open \
--stash-artifact \
--gzip-artifact \
--out "$OUT"
2) Inspect the capsule (read-only)¶
CAPSULE=$(find "$OUT" -mindepth 1 -maxdepth 1 -type d | sort | tail -1)
openclaw-mem capsule inspect "$CAPSULE"
3) Verify capsule integrity¶
openclaw-mem capsule verify "$CAPSULE"
4) Diff the capsule against a target store (read-only)¶
openclaw-mem capsule diff \
"$CAPSULE" \
--db "$DB" \
--write-receipt \
--write-report-md
5) Export canonical artifact (bounded write + dry-run preview)¶
CANONICAL_OUT=/tmp/openclaw-mem-canonical-export
openclaw-mem capsule export-canonical --db "$DB" --to "$CANONICAL_OUT" --json
openclaw-mem capsule export-canonical --db "$DB" --dry-run --to "$CANONICAL_OUT" --json
6) Restore canonical artifact into isolated target store¶
CANONICAL=$(find "$CANONICAL_OUT" -mindepth 1 -maxdepth 1 -type d | sort | tail -1)
ISOLATED_DB=/tmp/openclaw-mem-restore-isolated.sqlite
openclaw-mem capsule restore "$CANONICAL" --dry-run --db "$ISOLATED_DB" --json
openclaw-mem capsule restore "$CANONICAL" --apply --db "$ISOLATED_DB" --json
Files you get¶
After seal:
- manifest.json
- includes forward-compat metadata like capsule_version, exported_at, and integrity_hash
- bundle.json
- bundle_text.md
- trace.json (when available)
- artifact_stash.json (when artifact stash is enabled)
After diff --write-receipt --write-report-md:
- diff.latest.json
- diff.latest.md
After export-canonical (non-dry-run; timestamped directory under --to):
- manifest.json (openclaw-mem.canonical-capsule.v1)
- observations.jsonl
- index.json
- provenance.json
After restore --apply (next to target --db):
- <target_db_filename>.restore-<stamp>.rollback.json
- <target_db_filename>.restore-<stamp>.receipt.json
Boundary rules¶
seal¶
- wraps
openclaw-mem pack --json --trace - packages the result into a timestamped capsule directory
- optional
artifact stashis a receipt convenience, not a new storage system
inspect¶
- verifies first, then shows capsule metadata and a small bundle preview
- can emit human-readable output or structured JSON
- explicitly marks current v0 pack capsules as not restorable
verify¶
- checks declared capsule files against
manifest.json - validates sha256 + byte counts
- fails on tamper/drift
diff¶
- verifies first
- compares capsule items to a target observation store
- current match rule: normalized
kind + summaryexact match - emits
presentvsmissing - does not mutate the target store
export-canonical¶
- non-dry-run writes a versioned canonical artifact directory and runs self-verify
--dry-runemits canonical-manifest contract preview only- supports machine-readable JSON output (
--json) - defines bounded restore posture (isolated/new target only, same-engine, append-only)
- keeps cross-store migration/merge/live-target restore out of scope
restore¶
- supports canonical artifacts only (
openclaw-mem.canonical-capsule.v1, version 1) --dry-runperforms schema/version checks + target conflict planning with no mutation--applyis allowed only for isolated/new target store (observationsrows must be zero before apply)- rejects live-risky targets cleanly (default host DB path / source DB target / non-empty target)
- writes rollback manifest and restore receipt, and includes readback verifier proof
Why inspect + diff still matter even with restore¶
inspect and diff remain the truthful read-only lanes for pack capsules.
Restore exists only for canonical artifacts generated by export-canonical.
That keeps the line explicit:
- pack capsule = portable audit/report surface
- canonical capsule = bounded isolated replay surface
Verifier checklist¶
Same-store audit (pack lane)¶
- seal from a test DB
- verify passes
- diff against the same DB →
present > 0,missing = 0
Empty-store audit (pack lane)¶
- diff against an empty/missing observations store →
missing > 0 target_store_table_statusshould make the situation explicit
Canonical restore preflight/apply (bounded lane)¶
- export canonical artifact from source test DB
- run
restore --dry-run --db <isolated target>→ok: true,mutation: none - run
restore --apply --db <isolated target>→ rollback manifest + receipt written - readback verifier in receipt must show
ok: trueand matching row/digest counts - rerun
restore --applyagainst same target → clean reject (non_empty_target_store)
Tamper detection¶
- modify
bundle_text.mdor canonical file covered by manifest - verify should fail non-zero
Compatibility wrappers¶
Primary lane is now first-class under openclaw-mem capsule ....
Compatibility wrappers still exist:
openclaw-mem-pack-capsule seal ...
openclaw-mem-pack-capsule inspect <capsule_dir>
openclaw-mem-pack-capsule verify <capsule_dir>
openclaw-mem-pack-capsule diff <capsule_dir> --db <path> --write-receipt --write-report-md
openclaw-mem-pack-capsule export-canonical --to <output_root> --json
openclaw-mem-pack-capsule restore <canonical_dir> --dry-run --db <isolated_db> --json
python3 ./tools/pack_capsule.py restore <canonical_dir> --apply --db <isolated_db> --json
Both wrappers delegate to the same implementation as openclaw-mem capsule ....