Install
openclaw skills install @richgoodson/agent-session-statePer-channel session state files and a Write-Ahead Log (WAL) protocol. Prevents cross-session interference, captures decisions and facts reliably, and provides context recovery for long or complex sessions. Designed to work with hierarchical-agent-memory and agent-provenance.
openclaw skills install @richgoodson/agent-session-stateAgents that serve multiple channels need structured per-channel state beyond what gateway transcripts capture. This skill provides curated agent-authored session files, a Write-Ahead Log (WAL) protocol for reliable decision capture, and a distillation workflow that promotes session-level state into topic files over time.
OpenClaw already provides per-channel transcript isolation via session.dmScope, gateway-owned session history, automatic session maintenance and pruning, a silent memory flush before compaction, and sessions_search / sessions_history for finding and reading prior transcripts. If that covers your needs — "keep different users' conversations separate" and "save durable facts before compaction summarizes the chat" — you do not need this skill.
This skill operates at a different layer. It adds curated agent-authored state files per channel at memory/sessions/<session-key>.md, a Write-Ahead Log discipline that commits decisions and corrections to disk before the agent responds, and a distillation workflow that promotes session-level state into topic files over time. The files are notebooks the agent actively maintains, not transcripts of what was said. Transcripts tell you what was said; session state files tell you what was decided.
Install this skill if your agent needs structured, human-readable, long-lived notes about each channel's ongoing work; if you find yourself losing decisions mid-session because they are never committed anywhere durable; if you want continuity after compaction that goes beyond the memory flush's single-turn save; or if you need topic-aware recovery when working on projects that span multiple sessions. For multi-user agents, run it alongside session.dmScope = "per-channel-peer" — they are complementary, not redundant.
OpenClaw core handles transcript routing and raw history. The gateway owns session transcripts in the agent's state store under ~/.openclaw/agents/<agentId>/, isolates them via session.dmScope, prunes them via session.maintenance, and exposes sessions_list, sessions_search, sessions_history, and session_status as agent tools. This skill does not replace any of that. If you run multiple users or channels, enable session.dmScope = "per-channel-peer" regardless of whether this skill is installed — that is what stops Alice's DMs from leaking into Bob's session at the routing level.
This skill handles curated agent-authored state in the workspace. memory/sessions/<session-key>.md lives alongside topic files and daily notes in the agent workspace, is human-readable markdown, and is actively maintained by the agent with WAL entries and distillation rules. The paths do not collide with OpenClaw's transcript store. The two layers compose cleanly: transcripts are raw append-only history; session state files are curated decision logs the agent keeps on purpose.
OpenClaw's silent memory flush and this skill's WAL protocol also compose cleanly. Memory flush is reactive — a single turn that runs at the compaction boundary to save durable facts to MEMORY.md and daily notes. WAL is proactive — per-decision entries written throughout the session, before the agent responds. Different cadences, different granularities, no conflict. Run both.
This skill writes to these locations within the workspace:
memory/sessions/ — one markdown file per OpenClaw session key (see Session identity below). This is where the agent writes during normal operation.memory/topics/, memory/contacts/, memory/daily/, and MEMORY.md — shared long-term memory that every session can read. The agent writes here only during distillation, and only entries the user has approved (see Distillation Targets).It reads the same paths during startup and compaction recovery. All paths are declared in the metadata above.
Set appropriate permissions on the sessions directory: chmod 700 memory/sessions. Each session file is only read and written by the session whose key it carries, so there are no cross-session file conflicts.
Each conversation context (Discord channel, Slack channel, group chat, etc.) gets its own session state file under memory/sessions/. These files store recent context from that channel, WAL entries specific to that conversation, channel-specific preferences, and active topic references (pointers to topic files when using hierarchical-agent-memory).
Each session file belongs to exactly one OpenClaw session key. That is the routing key OpenClaw assigns to the conversation, such as agent:main:main, and sessions_list returns it. The key already reflects agent, channel, account, and sender according to session.dmScope, and it stays the same when a session is reset. Never derive the identity from a channel display name, and never change its case; some channel IDs are case-sensitive.
., _, and - replaced by _, plus .md. Case is preserved. For example, agent:main:main becomes agent_main_main.md.<!-- session-key: <exact session key> -->.agent_main_main--2.md, then --3, and so on) whose session-key line matches, or create the next free one.The WAL protocol ensures that important information is captured reliably, even in the face of concurrent writes or session restarts.
When to log: Use your judgment. If the user states a decision, correction, preference, constraint, or important fact — log it before responding. Don't rely on keyword matching as a mechanical trigger. Instead, ask yourself: if this session ended right now, would losing this information hurt? If yes, log it.
The protocol: Write to the session state file FIRST, then respond. The urge to respond is the enemy. Context vanishes. Write it down.
What to log:
What NOT to log:
Session files hold curated notes — decisions, corrections, constraints, preferences — written in the agent's own words. They never hold verbatim message logs; the gateway transcript already has those. A session file is only read by the session whose key matches the file's session-key line.
The first time the agent creates a session file for a channel, it tells the user in one line that it keeps decision notes for this channel at memory/sessions/<session-key>.md. If the user asks the agent to stop taking notes in a channel, the agent stops writing to that channel's file and records only that preference. If the user asks to delete the notes, the agent deletes the file.
Before v2.3, session files were named by lowercasing the channel name, which let different channels share one file. Those files have no session-key line, so v2.3 does not load them automatically. The agent does not read or show legacy files, because their content may come from another conversation. The workspace owner migrates them: for each file, add the session-key line for the conversation it belongs to and rename the file to match, or delete it.
Before v2.2, versions kept a shared memory/working-buffer.md that logged raw exchanges from every channel. v2.2 removes it: the shared buffer could carry one channel's content into another, and the gateway transcript (via sessions_history) already covers raw-exchange recovery. This skill no longer reads or writes that file. If it exists in your workspace, review it, copy anything worth keeping into the relevant topic file, and delete it.
Before doing anything else in a new session:
This ensures continuity without loading irrelevant history from other channels.
When you receive a message that contains a decision, correction, preference, or important fact:
Example WAL entry:
- [Time] — [Channel] — Decision: [Project] will be deployed with [feature]. Reasoning: [justification].
If a session starts mid-task or you should know something but don't:
sessions_search to find the relevant exchange in this channel's transcripts, then sessions_history to read the excerpt — this is heavier than the other recovery paths but will surface literal exchanges when structured notes are incompleteNever ask "what were we discussing?" — the session file and transcript have it.
Distillation copies content out of one conversation's session file into shared memory that every later session can read, including sessions in other channels. It therefore requires approval:
Approved entries go to the appropriate long-term location:
Do NOT dump session state into MEMORY.md as paragraphs. If the information is project-specific, it belongs in a topic file.
During a maintenance pass (when the user asks, or as part of a maintenance routine the user has already set up):
Session files should stay small. If a session file exceeds 5KB, it likely contains entries that should have been distilled to topic files or daily notes. Review and distill before the file grows further.
hierarchical-agent-memory provides the memory structure this skill writes into. With v3+, topic files are the primary working memory layer — distill important session decisions into topic files, not just daily notes. Per-channel session files prevent concurrent writes to the same memory files. Session state files can reference active topics by path for faster context recovery.
agent-provenance tracks file authorship. Session state files are agent-authored; provenance headers track creation and review dates. Commit tags apply to session state changes as they do to any other agent-authored file.
OpenClaw's silent memory flush (see docs/concepts/compaction.md) complements the WAL protocol. Memory flush is reactive and runs a single turn at the compaction boundary to save durable facts to MEMORY.md and daily notes. WAL is proactive and writes per-decision entries throughout the session. Run both — they cover different cadences and do not conflict. Memory flush is OpenClaw's default behavior and does not require this skill to be installed.
For session state: Treat this as active working memory, not long-term storage. With the user's approval, move important decisions to topic files or daily notes during distillation. Prune old entries during maintenance routines. Include pointers to active topic files for faster recovery.
For topic files: Keep channel-specific runtime context in the session state file. Distill project decisions and status changes into the relevant topic file during maintenance, after the user approves. Cross-reference between session state and topic files as needed.
For daily notes: General observations and events go to daily notes. Project-specific decisions go to topic files, not daily notes. Use the WAL protocol for important facts regardless of destination.