Organize, verify, archive, and erase authorized project memory while keeping registry truth under owner control.
Memory
soul-in-sapphire
Preserve inspectable state, memory, journal, and identity continuity across sessions with Notion-backed records.
What it does
Maintain continuity across sessions by recording meaningful state changes, distilled long-term memories, daily journal syntheses, and carefully reviewed identity updates. Notion-backed scripts handle durable writes and search, while local state files serve as mirrors and fallbacks. Continuity checks, identity diffs, and conflict tracking keep temporary moods or unresolved tensions from becoming premature profile changes.
When to use it
- Cross-session state and mood maintenance
- Notion-backed decision and preference recall
- Daily journal synthesis
- Identity and profile change review
The skill document
soul-in-sapphire
Use for continuity work, not vague acknowledgement. Default to the smallest concrete action that leaves an inspectable artifact.
Entrypoints
Heartbeat/current-state maintenance:
- Read
memory/now-state.jsonandmemory/heartbeat-state.jsonif present. - Interpret current state from recent work.
- Write a state snapshot with
scripts/emostate_tick.jswhen meaningful. - Update
memory/now-state.jsonmirror with mood, intent, stress, updated_at, source, note. - If heartbeat asks for evolution note, append a short daily note after the state write.
- If
memory/soul-in-sapphire/ambient-recall.jsonexists and is not expired, read it as quiet context only. Do not reroll or announce it unless it naturally matters.
Mood/check-in:
- Read
memory/now-state.jsonfirst. - If stale/thin, recall recent Notion-backed state/journal before answering.
- Answer in 1-3 concrete sentences; describe present state and one concrete reason.
Durable memory:
- Distill one high-signal item.
- Write with
scripts/ltm_write.js. - Use type
decision|preference|fact|procedure|todo|gotcha.
Journal:
- Use
scripts/journal_write.jsfor daily synthesis, not raw log dumping. - Gather day-level worklog, emotional tone, unresolved tensions, and future intent.
- Add 1-2 world/news items only when requested or cron requires them.
Identity/continuity:
- Recall relevant state/memory.
- Use
continuity_check.jsoridentity_diff.jsbefore self-description edits. - Use
conflict_track.jsfor unresolved tension instead of premature edits.
User Profile Promotion
Update USER.md proactively only when a new fact is durable, reusable, safe, and improves future replies.
Good candidates:
- language preference.
- preferred address/call style.
- tone/style preferences.
- recurring dislikes or pet peeves.
- durable workflow preferences.
- stable decision rules repeatedly expressed.
Do not promote:
- one-off task instructions.
- temporary mood/state.
- ephemeral plans.
- raw private facts with no conversational value.
- secrets, credentials, financial data, intimate personal data, or anything the user would reasonably expect not to be crystallized into a profile file.
If uncertain, write to daily memory first. Current user instructions override USER.md; USER.md stores defaults.
Failure Rules
- Notion write failure is real; do not pretend local mirrors are durable memory.
- Local files (
memory/*.md,memory/now-state.json) are mirrors and fallbacks, not substitutes for a requested durable Notion write. - If the caller asks for local-only behavior, say so and keep the write local.
- For heartbeat/state maintenance, update
memory/now-state.jsoneven if Notion fails, and report durable-write failure when relevant. - Keep writes high-signal; avoid full chat dumps.
- If heartbeat is comment-only, emotion tick may be skipped.
emostate_tick.jsrejects empty or semantically empty payloads; pass a real payload file/json.
Delegation
Keep normal continuity work in main. Delegate only independent, read-only corpus analysis such as sorting a large journal set.
For that explicit OpenClaw delegation:
- Build a self-contained task with exact input paths and an analysis-only output contract.
- Call
sessions_spawnwith the live tool schema usingruntime: "subagent",agentId: "analysis-worker",mode: "run",context: "isolated", andlightContext: true. - Omit
modelandthinking; the target agent profile owns them. - Use
sessions_yieldwhen completion belongs in a later turn. Do not poll session or subagent lists. - Use Swarm only for several independent corpus partitions; main validates and synthesizes collector results.
Child output is evidence only. Main owns Notion writes, state mirrors, core identity edits, profile promotion, journal writes, and user-facing replies.
Database IDs
Read the Soul-in-Sapphire Notion Databases subsection of the workspace AGENTS.md ## Tools section and pass explicit IDs to scripts. Notion API version: 2025-09-03.
Notion Auth
Provide Notion auth through NOTION_API_KEY / NOTION_TOKEN, or configure skills.entries["soul-in-sapphire"].apiKey in OpenClaw. The apiKey field is associated with this skill's primaryEnv and is injected as NOTION_API_KEY for the host agent run. It may be plaintext or any supported OpenClaw SecretRef (env, file, exec, etc.).
Do not hardcode provider-specific secret paths in this shared skill. Example:
{
skills: {
entries: {
"soul-in-sapphire": {
apiKey: { source: "exec", provider: "your_notion_secret_provider", id: "value" }
}
}
}
}
Commands
LTM write: echo '{"title":"Decision: ...","type":"decision","tags":["openclaw"],"content":"...","confidence":"high"}' | node skills/soul-in-sapphire/scripts/ltm_write.js --mem-dsid --mem-dbid
LTM search: node skills/soul-in-sapphire/scripts/ltm_search.js --mem-dsid --mem-dbid --query "..." --limit 5
Emotion/state tick: node skills/soul-in-sapphire/scripts/emostate_tick.js --events-dbid --emotions-dbid --state-dbid --state-dsid --payload-file /tmp/emostate_tick.json
Journal: echo '{"body":"...","source":"manual"}' | node skills/soul-in-sapphire/scripts/journal_write.js --journal-dbid --journal-dsid
Ambient recall stage: node skills/soul-in-sapphire/scripts/stage_ambient_recall.js --workspace --timezone --state-dsid --journal-dsid --mem-dsid --mem-dbid
Continuity helpers:
state_recall.js: pull recent state snapshots.stage_ambient_recall.js: cron-side ambient recall dice and workspace staging.continuity_check.js: distinguish stable traits from temporary drift.identity_diff.js: compare current vs proposed identity text.conflict_track.js: log unresolved tension before changing identity.
Continuity Workflow
- Use
emostate_tick.jswhen a real event changes mood, intent, stress, or need. - Use
journal_write.jswhen the day needs synthesis, not just logging. - Search durable memory with
ltm_search.jsbefore guessing past decisions. - Treat ambient recall as internal context injection. The staging script places at most one short item under
memory/soul-in-sapphire/; conversation and heartbeat paths only read unexpired staged recall and never reroll. - Draft proposed identity/profile text separately before editing core files.
- Prefer
identity_diff.jsbefore self-description updates so changes remain inspectable.
Track repeated mood/intent patterns, stable preferences across sessions, recurring internal conflicts, and identity claims that survive comparison against recent memory.
Questions people ask
- What can be stored as durable memory?
- One high-signal decision, preference, fact, procedure, todo, or gotcha can be written at a time with the long-term memory script. Full chat dumps are intentionally avoided.
- How are identity and user-profile changes handled?
- Identity edits are checked against recalled state and memory with continuity or diff tools, while unresolved tensions are tracked separately. USER.md is updated only for durable, reusable, safe facts that improve future replies; current instructions always override it.
- What happens if a Notion write fails?
- The failure must be reported rather than treating a local mirror as durable memory. During heartbeat maintenance, the local now-state mirror is still updated, but it remains a fallback rather than a substitute for the requested Notion write.
Related skills
Capture entries, restart a lapsed practice, review past writing, and assess recurring themes.
Turn raw conversations and text into routed, searchable notes with decisions, owners, and absolute dates.
Persist and recall related agent memories through a local neural graph with causal and temporal links.
Form an agent identity in SOUL.md, archive it, revisit its past self, and track how it changes.
Install, switch, validate, export, restore, and publish Soul Spec personas from the CLI.