Self Improvement Loop
by @one2agi
Per-agent feedback loop for OpenClaw — captures corrections/errors/features, detects patterns per agent workspace, notifies via per-agent channel bot, and ex...
clawhub install self-improvement-loop📖 About This Skill
name: self-improvement-loop version: 4.6.13 description: | Per-agent feedback loop for OpenClaw — captures corrections/errors/features, detects patterns per agent workspace, notifies via per-agent channel bot, and executes A/B/C/D decisions in the correct agent session. Auto-detects agents from openclaw.json, auto-maps agent ID → channel account → bindings. A/B/C/D handling logic lives in scripts/agents-append.md (shared); install.sh injects a reference into each agent's AGENTS.md and memory.md.
self-improvement-loop v4.6.13
Overview
Core Capability: Each agent has its own self-improvement feedback loop — isolated learnings directory, independent cron scan, notifications bound to their own channel bot, and A/B/C/D execution in the correct agent session.
User corrects code-dev agent
↓
code-dev hook captures → writes to code-dev/.learnings/
↓
self-improvement-code-dev cron (hourly) → scans only code-dev/.learnings/
↓
Pattern detected (count≥2) → notifies user via code bot
↓
User replies A → code-dev agent session executes → writes back to code-dev workspace
Data Flow (Per-Agent Isolation)
openclaw.json (agents.list + bindings)
│
├─→ install.sh reads agents
│ ↓
│ Creates per-agent directories (e.g., agents/workspace/.learnings/)
│
├─→ install.sh reads channel accounts
│ ↓
│ Writes bindings (agentId → accountId)
│ { "agentId": "code-dev", "match": { "channel": "telegram", "accountId": "code" } }
│
└─→ setup_crons.py creates per-agent cron
↓
Each cron carries --agent flag
LEARNINGS_DIR points to that agent's workspace
delivery uses that agent's account┌─────────────────────────────────────────────────────────────┐
│ Hook (handler.js) - Global shared, dynamic routing │
│ sessionKey: "agent:code-dev:telegram:..." │
│ → extractAgentId("code-dev") │
│ → getAgentWorkspace("code-dev") → agent workspace path │
│ → learningsDir = workspace + "/.learnings/" │
│ Pushes reminders to context.messages │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Cron (per-agent) - Independent execution │
│ Name: self-improvement-code-dev │
│ --agent code-dev → bound to code-dev agent session │
│ LEARNINGS_DIR=".../agents/code-dev/.learnings" │
│ delivery: channel=telegram, accountId=code │
│ Scans only its own LEARNINGS_DIR │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Notification - Sent via respective channel bot │
│ code bot → user conversation with code-dev │
│ moling bot → user conversation with moling │
│ User replies A/B/C/D → OpenClaw routes to correct agent │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ A/B/C/D Execution - Runs in correct agent session │
│ Reads pending JSON → executes skill-creator/skill-improvement
│ Writes back to that agent's learnings directory │
└─────────────────────────────────────────────────────────────┘
Permissions Required
| Permission | Scope | Purpose |
|---------------|------------------------------|----------------------------------------------------|
| exec | scripts/ | Run distill.sh, archive.sh (mechanical scan/archive) |
| read | | Read LEARNINGS.md, ERRORS.md, FEATURE_REQUESTS.md |
| write | | Update notified status; create .pending_notifications/*.json |
| cron | Global | Create and manage self-improvement-{agent} cron jobs |
| gateway_api | Gateway :18789 | setup_crons.py calls API to create crons |
| openclaw.json | HOME/.openclaw/ | install.sh reads agent config; writes bindings |
Security Boundaries:
~/.openclaw/workspace/Core Components
| Component | Type | Routing Basis |
|---------------------|---------------|--------------------------------------|
| handler.js | Global Hook | sessionKey → agent ID → workspace |
| distill.sh | Shared Script | LEARNINGS_DIR environment variable |
| setup_crons.py | Shared Script | agent config → cron --agent flag |
| install.sh | Install Script| agents.list + accounts → bindings |
| agents-append.md | A/B/C/D Logic | Shared across agents; install.sh injects index reference |
Installation
bash ~/.openclaw/workspace/skills/self-improvement-loop/install.sh
openclaw gateway restart
Installation automatically:
1. Creates .learnings/ directories for each agent
2. Installs hook and scripts
3. Creates per-agent cron jobs
4. Updates openclaw.json bindings (enables message routing)
5. Injects self-improvement index instructions into each agent workspace's AGENTS.md and memory.md
A/B/C/D handling logic is stored in skills/self-improvement-loop/scripts/agents-append.md (shared). During install, index references are injected into each agent's AGENTS.md and memory.md:
## Self-Improvement (A/B/C/D)Before handling A/B/C/D, must consult:
skills/self-improvement-loop/scripts/agents-append.md
No manual appending needed after install; skill updates automatically use the latest version for all agents.
Verification
# Check bindings
python3 -c "import json; print(json.dumps(json.load(open('$HOME/.openclaw/openclaw.json')).get('bindings',[]), indent=2))"Check per-agent crons
openclaw cron list | grep self-improvementTest distill (specific agent)
LEARNINGS_DIR="$HOME/.openclaw/workspace/agents/code-dev/.learnings" \
bash ~/.openclaw/workspace/skills/self-improvement-loop/scripts/distill.sh --check-only
Dependencies
| Dependency | Version | Purpose | |-------------------|-----------|----------------------------------------| | OpenClaw | ≥2026.4 | Platform foundation | | Python3 | ≥3.8 | distill_json.py, write_notified.py | | Node.js | any | handler.js | | skill-creator | any | Path A - create skills | | skill-improvement | any | Path B - improve skills |
Security Notes
File Cleanup Policy
archive.sh includes an automated maintenance task that removes orphaned pending notification files older than 7 days:find "$PENDING_DIR" -name "*.json" -mtime +7 -delete
.learnings/.pending_notifications/archive.sh executes (after archiving resolved/promoted entries).learnings/.pending_notifications/ subdirectoryThis cleanup is the reason for the suspicious.destructive_delete_command moderation flag on published versions. It is a legitimate housekeeping operation, not a general-purpose delete mechanism.
Limitations & Known Issues
defaultAccountSee Also
references/setup-guide.md — Full installation and configuration guide