Reflexio
by @yyiilluu
Captures user facts and procedural corrections into .reflexio/ so the agent learns across sessions. Use when: (1) user states a preference, fact, config, or...
clawhub install reflexioπ About This Skill
name: reflexio-embedded description: "Captures user facts and procedural corrections into .reflexio/ so the agent learns across sessions. Use when: (1) user states a preference, fact, config, or constraint; (2) user corrects the agent and confirms the fix with an explicit 'good'/'perfect' or by moving on without re-correcting for 1-2 turns; (3) at start of a user turn, to retrieve relevant facts and playbooks from past sessions." metadata:
Reflexio Embedded Skill
Captures user facts (profiles) and procedural corrections (playbooks) into .reflexio/, so the agent learns across sessions. All memory lives in Openclaw's native primitives β no external service required.
First-time setup per agent
If .reflexio/.setup_complete_ does NOT exist (where is your current agent id), perform this one-time check. The setup step runs probing commands via exec and asks for approval before making changes.
Steps:
1. Probe current config:
- openclaw config get plugins.entries.active-memory.config.agents
- openclaw config get agents.defaults.memorySearch.extraPaths
- openclaw memory status --deep
2. If active-memory is not targeting this agent:
Ask user: *"To auto-inject relevant facts into each turn, I can enable active-memory for this agent. OK if I run openclaw config set plugins.entries.active-memory.config.agents '[\"?"*
On approval, run the command.
3. If .reflexio/ is not registered as an extraPath:
Ask user: *"I need to register .reflexio/ as a memory path. OK if I run openclaw config set agents.defaults.memorySearch.extraPaths '[\".reflexio/\"]' --strict-json?"*
On approval, run the command.
4. If no embedding provider is configured (FTS-only mode):
Tell user: *"Vector search requires an embedding API key (OpenAI, Gemini, Voyage, or Mistral). The plugin works without one but retrieval quality drops. Would you like guidance on adding one?"*
If yes, guide them through openclaw config set or openclaw configure.
5. On each decline, note the degraded mode but do not block:
- No active-memory β you must run openclaw memory search via exec at turn start (see "Retrieval" section below).
- No extraPath β WARN the user the plugin cannot function without this step.
- No embedding β continue with FTS-only.
6. When all checks resolved (approved or accepted with warning): create the marker:
mkdir -p .reflexio
touch .reflexio/.setup_complete_
If exec is not available (strict admin policy): fall back to telling the user the exact commands to run manually.
First-Use Initialisation
Before any write, ensure .reflexio/ and its subdirectories exist. This is idempotent β safe to run every session:
mkdir -p .reflexio/profiles .reflexio/playbooks
Never overwrite existing files. Never write secrets, tokens, private keys, environment variables, or credentials into .reflexio/ files. When capturing a fact involves a user-pasted snippet that contains credentials, redact first.
Quick Reference
| Situation | Action |
|-----------------------------------------------------------|--------------------------------------------|
| User states preference, fact, config, or constraint | reflexio_write_profile tool |
| User correction β you adjust β user confirms | reflexio_write_playbook tool |
| Start of user turn, need context | reflexio_search tool |
| Unsure whether to capture | Skip; batch pass at session-end has a second shot |
Detection Triggers
Profile signals (write immediately, same turn)
For each such signal, call the reflexio_write_profile tool with a kebab-case topic slug and an appropriate TTL. See "TTL Selection" below.
Playbook signals (write AFTER confirmation)
Playbooks require a specific multi-turn pattern:
1. Correction: *"No, that's wrong"*, *"Actually..."*, *"Don't do X"*, *"Not like that"*, *"We don't use X here"*. 2. You adjust: you redo the work per the correction. 3. Confirmation (required β without this, do NOT write a playbook): - Explicit: *"good"*, *"perfect"*, *"yes that's right"*, *"correct"*. - Implicit: the user moves to an unrelated topic without re-correcting for 1-2 more turns.
Explicit don't-write rule: if you see a correction without subsequent confirmation, do not write a playbook. The fix may be wrong; let the batch pass at session end re-evaluate.
Retrieval
When Active Memory is enabled
Your turn context may already contain Reflexio-prefixed entries injected by Active Memory. Incorporate them before responding. No tool call needed.
Fallback when Active Memory is absent
At the start of each user turn, call the reflexio_search tool with:
The tool handles query preprocessing and memory search internally. Incorporate any results into your response. Skip if the user's message is trivial.
Important: Do NOT use the memory_search tool (returns config, not results)
or exec with openclaw memory search β use the reflexio_search tool instead.
File Format
Do NOT construct filenames or frontmatter by hand. Use the registered tools (reflexio_write_profile, reflexio_write_playbook). They generate IDs, enforce the frontmatter schema, and write atomically.
Profile template (for mental model β the script emits this)
---
type: profile
id: prof_
created:
ttl:
expires:
supersedes: [] # optional, only after a merge
<1-3 sentences, one fact per file>
Playbook template
---
type: playbook
id: pbk_
created:
supersedes: [] # optional
When
<1-sentence trigger β this is the search anchor; make it a noun phrase>What
<2-3 sentences of the procedural rule; DO / DON'T as actually observed>Why
How to invoke
Profile: Call the reflexio_write_profile tool with:
Playbook: Call the reflexio_write_playbook tool with:
Retrieve context: Call the reflexio_search tool with:
All tools handle preprocessing, memory search, contradiction detection, and file operations internally. You only detect the signal, compose the content, and call the tool.
TTL Selection (profiles only)
infinity β durable, non-perishable facts (diet, name, permanent preferences)one_year β stable but could plausibly change (address, role, team)one_quarter β current focus (active project, sprint theme)one_month β short-term contextone_week / one_day β transient (today's agenda, this week's priorities)Pick the most generous TTL that still reflects reality. When in doubt, prefer infinity β let dedup handle later contradictions via supersession.
Safety
Best Practices
1. Write immediately on a clear signal. Don't queue to session-end β that's Flow C's job; you have a different role.
2. One fact per profile file. Multi-fact files are harder to dedupe and easier to contradict.
3. Trigger phrase = search anchor. Write ## When as a noun phrase describing the situation, not a sentence. Retrieval hits on semantic similarity to this field.
4. Skip writing when uncertain. Flow C has a second pass over the full transcript. It's better to let it handle ambiguous cases.
5. Prefer shorter TTL for transient facts. Don't let "working on project X" accumulate as infinity-TTL cruft.
Opt-in Hook
This skill works standalone β your in-session Flow A (profile) and Flow B (playbook) writes populate .reflexio/ without any hook.
The optional hook (hook/ directory of this plugin) adds two capabilities:
1. TTL sweep at session start: deletes expired profiles before Active Memory runs.
2. Session-end batch extraction (Flow C): on session:compact:before, command:stop, or command:reset, spawns a reflexio-extractor sub-agent that extracts profiles/playbooks from the full transcript and runs shallow pairwise dedup.
See this plugin's README.md for install instructions (runs via ./scripts/install.sh). If the hook is not installed, Flows A+B still work.
π Tips & Best Practices
1. Write immediately on a clear signal. Don't queue to session-end β that's Flow C's job; you have a different role.
2. One fact per profile file. Multi-fact files are harder to dedupe and easier to contradict.
3. Trigger phrase = search anchor. Write ## When as a noun phrase describing the situation, not a sentence. Retrieval hits on semantic similarity to this field.
4. Skip writing when uncertain. Flow C has a second pass over the full transcript. It's better to let it handle ambiguous cases.
5. Prefer shorter TTL for transient facts. Don't let "working on project X" accumulate as infinity-TTL cruft.