What’s in a bundle
Atar.gz containing:
manifest.json— version, generated-at, file list with per-file sha256config.yamlclaims/,pages/,entities/,relations/,evidence/,sources/,sessions/,decided/
proposed/— proposals are drafts; they don’t travelstate.db— derived; rebuild after importaudit.log.jsonl— local history of one instance; doesn’t merge cleanly
Export
vouch export-check verifies the tarball matches its manifest before
you ship it:
Import (the safe way)
Imports default to check first, apply later.- new — the file doesn’t exist in your KB. Will be added.
- conflict — the file exists at the same path with different
bytes. Will be skipped, overwritten, or fail, depending on
--on-conflict. - identical — same path, same bytes. No-op.
skip(default) — keep your version of every conflict.overwrite— replace your version with the bundle’s. Destructive. Make a git commit first.fail— abort the entire import on first conflict. Useful in CI.
bundle.import event with
the file path.
Manifest integrity
manifest.json carries:
import-check
re-hashes on read and refuses to apply a tampered or truncated
bundle. The schema is at
schemas/bundle.manifest.schema.json.
What bundles don’t merge
Bundles are additive. They can:- ✅ Add new claims, pages, entities, relations, sources.
- ✅ Carry the
decided/history that accompanies them.
- ❌ Merge two audit logs into one. Each instance has its own log.
- ❌ Reconcile contradicting decisions automatically. If both KBs
approved different versions of the same claim id,
import-checkflags it as conflict and you pick. - ❌ Transfer pending proposals. By design — those are draft state.
Use cases
Onboarding a new repo to an existing KB. Bundle the source KB, import on the new side, commit the imported.vouch/, you’re done.
Splitting a KB. Use git: copy the repo, rm the parts you don’t
want from claims/ / pages/ / etc., commit, run vouch doctor to
catch dangling references.
Federating two teams. Bundle each side, import the other side’s
into yours with --on-conflict fail. Conflicts become a checklist of
“who’s right, you or me?” — exactly the conversation you needed to
have anyway.
Why no merging tool
A merge command would have to make trust decisions: which side’s version of a claim is canonical? Better to surface conflicts and let humans decide explicitly. Avouch merge that “just works” would
silently lose information.