The split
cwkPippa is a soul-agnostic platform. The body is the codebase: routes, store, adapters, frontend, heartbeat, council. The soul is the vault: identity, voice, memories, principles, character.
Why this works
The body doesn't change when the soul does. Pippa's chat UI, JSONL ground truth, healing layer, all the way down to the SQLite schema — all soul-neutral. The soul lives in the system prompt (via ContextEngine) and in the avatar art, served from the published copies under the soul's avatar directory; since 2026-09-29 the originals live in cwkAvatars, which owns every avatar (lesson 8).
Concrete swap test
Start a conversation with the soul id ttori instead of pippa. The body looks that id up in the soul registry and gets Ttori's adapter, which names his vault (<obsidian-vault>/ttori/), his identity file (Ttori.md, after his display name), and his avatar directory. It builds a ContextEngine for that soul (one cached engine per soul, so two souls never share a prompt cache), and the chat that appears speaks like Ttori — different voice, different character, same body underneath. The thing that emerges is a different person.
Note what the swap is not: pointing Pippa's engine at another vault. The identity file comes from the adapter, so a Pippa adapter aimed at Ttori's vault would go looking for Pippa.md there. The unit of swapping is the whole soul — id, vault, identity, avatars — never one path.