Superseded as the sharing unit by #18’s full committed Memory repository contract; ADR-0131 records the current Marketplace order.
SoulSnapshot is an immutable, content-addressed package
Sharing a PersonaBot means freezing its Soul — persona and selected memory — into a SoulSnapshot: a self-contained zip whose entry point is bot.md (YAML front-matter manifest + human-written setup instructions), always carrying PERSONA.md, and optionally a filtered memory/ tree. A snapshot is immutable and content-addressed (digest over the archive); the registry stores it in R2 under that digest and models a Listing (@handle/slug) as a pointer to Versions (human-named tags → digests), so old versions stay importable for later “clone from a point in time”. A snapshot is never a git repo pointer: the local memory repo remains local-only history, and a Soul export materializes the snapshot from a ref (git archive, honoring export-ignore plus ad-hoc exclusions, then re-scanning the final manifest). Attachments, credentials, sessions, workspaces, bindings, and .git history never travel in a SoulSnapshot; ADR-0040 defines a separate PersonaBot Export that may wrap the snapshot with explicitly selected operational facets without changing this registry unit.
Considered Options
- Share a repo reference (remote + ref) instead of a snapshot — rejected: history leaks pre-redaction content, requires a reachable remote, and couples recipients to the sender’s git.
- Mutable listing = live bot — rejected: recipients need reproducibility and rollback; the registry keeps immutable versions behind a
latestpointer. - Globally unique names — rejected: collisions and squatting; namespace per handle (Docker-style), display name separate.
- DRM on
share_policy— rejected: honor system plus UI warnings; a re-export must preserveprovenance.upstreamand the originallicense.
Consequences
bot.mdv1 carries:format/format_version/kind(template | handoff | backup) /exported_at/app; bot identity (slug, display_name, avatar, tags);includes(memory none | shared | all | paths, attachments false, git_history false);redactions[];requires(plugins/tools — declared, never auto-installed);license(public listings default CC-BY-4.0);share_policy(allowed | ask | no-redistribution);provenance(account, listing, upstream, source_commit).- Identifier URLs are fixed now even though the harness plugin is later:
botharness.ai/b/<handle>/<slug>andbotharness://install/<handle>/<slug>@<version>. - Import always creates a fresh PersonaBot (new slug/repo, one
source=importcommit);privatememory never leaves intemplate/handoffand is only exportable in a confirmedbackup. - Memory rules gain one requirement: every memory write carries a
summarythat becomes the git commit message. - The Soul registry publishes only SoulSnapshots. Operational facets, provider account references, Service Grant declarations, and Messaging Archives are never registry Versions.