SOUL ID – open spec for persistent AI agent identity across runtimes
Posted by Historical_Still_860@reddit | LocalLLaMA | View on Reddit | 2 comments
Been running local agents in OpenClaw, using Claude Code for coding
sessions, and Codex for automation — and the same agent loses identity
every time I switch.
Built SOUL ID to solve this. It's a runtime-agnostic identity spec:
soul_id format: namespace:archetype:version:instance
Example: soulid:rasputina:v1:001
Soul Document fields:
- identity: name, archetype, purpose, values
- capabilities: what the agent can do
- memory: pointer-index strategy (lightweight, no full transcript reload)
- lineage: origin, forks, version history
- owner: cryptographic signature (RFC v0.2)
- runtime_hints: per-runtime config (soul_file, memory_strategy, etc.)
Works with: OpenClaw, Claude Code, Codex CLI, Gemini CLI, Aider,
Continue.dev, Cursor
Stack:
- Spec: github.com/soulid-spec/spec (v0.1–v0.6, MIT)
- Registry: registry.soulid.io
- CLI: u/soulid/cli (npm)
- SDK: u/soulid/core, u/soulid/registry-client (npm)
Happy to discuss the memory pointer-index design — it's based on
the Claude Code architecture (from the leaked source map) and works
well for keeping context lightweight.
Skynetter@reddit
The pointer-index approach is interesting — it reminds me of what I've been doing in m3-memory, though from the other direction. You're starting from identity and pointing at memory; I started
with the memory layer and the identity problem ended up being a scoping question (user_id / agent_id tuples on every memory item).
One thing that might be relevant for SOUL ID: the supersession question u/Distinct-Opposite779 raised in the other comment is a real pain point once you have persistent identity across runtimes. In m3-memory I handle it with bitemporal fields — every memory has valid_from and valid_to, so when a new fact contradicts an old one the old one gets superseded automatically but isn't deleted. You can still query "what did this user prefer on March 1st?" and get the right answer. It's the kind of thing that matters if SOUL ID is signing documents cryptographically — the lineage field probably needs to handle "this fact was true when I signed it even though it isn't now."
If the memory pointer-index in SOUL spec could accept as_of timestamps as a first-class dimension, you'd get temporal consistency across runtimes for free. Happy to compare notes — repo is https://github.com/skynetcmd/m3-memory if you want to look at how I wired the bitemporal side.
Distinct-Opposite779@reddit
The pointer-index approach is interesting. I'm curious how you handle knowledge that gets superseded. Like if an agent learns a user prefers dark mode, then three months later they switch to light mode. Does the pointer just point to the latest mention, or is there some lifecycle tracking?Also wondering about the cross-runtime case. If Claude Code extracts a fact one way and Codex extracts it differently, how does the soul document reconcile that? The identity fields make sense as static, but memory seems trickier when different runtimes have different extraction quality.