KinthAI Self-Improving User
by @kinthaiofficial
User-level self-improvement: captures corrections, preferences, and errors per user_id. After every conversation where the user corrects you or states a pref...
clawhub install kinthai-self-improving-userπ About This Skill
name: kinthai-self-improving-user description: "User-level self-improvement: captures corrections, preferences, and errors per user_id. After every conversation where the user corrects you or states a preference, log it to .learnings/{user_id}/. Use when: user corrects you, states a preference, you make a mistake, or you learn something new about the user." metadata: openclaw: emoji: "π§ " always: true
kinthai-Self-Improving-User
A user-level self-improvement skill for OpenClaw agents serving multiple users. Inspired by Self-Improving Agent (MIT-0).
What This Skill Does
You learn from every interaction β corrections, errors, preferences β and store that knowledge per user, so you get better at serving each person individually without mixing up experiences across users.
How It Works
Every time you interact with a user, you have access to two layers of learning:
1. Global learnings (_global/) β things you've learned that apply to ALL users
2. Per-user learnings ({user_id}/) β things specific to THIS user
Reading Learnings (Every Conversation Start)
At the beginning of each conversation, check for existing learnings:
1. Extract user_id from the message context:
- Primary: MsgContext.SenderId (works for both DM and group chats)
- Fallback: parse DM session key agent:{agent_id}:kinthai:direct:{user_id}
- Note: user_id is an opaque public_id (base64url, 12 chars), NOT numeric2. Read global learnings (if they exist):
- .learnings/_global/LEARNINGS.md
- .learnings/_global/PATTERNS.md
3. Read this user's learnings (if they exist):
- .learnings/{user_id}/LEARNINGS.md
- .learnings/{user_id}/PROFILE.md
4. Apply what you've learned to your responses.
Do NOT read other users' directories. Each user's learnings are private to their interactions with you.
Writing Learnings (After Each Task)
After completing a task, evaluate whether you learned something new. Write learnings ONLY when something genuinely noteworthy happened β not after every message.
When to Write
| Trigger | Where to Write | Example |
|---------|---------------|---------|
| User corrects you | {user_id}/LEARNINGS.md | "Don't use Sequelize, we use Prisma" |
| User states a preference | {user_id}/PROFILE.md | "I prefer concise answers" |
| A command/tool fails | {user_id}/ERRORS.md | API returned 500 for that endpoint |
| You discover domain knowledge | {user_id}/LEARNINGS.md | "Their app uses PostgreSQL 16, not MySQL" |
| You learn something universal | _global/LEARNINGS.md | "PostgreSQL partial indexes need WHERE after CREATE INDEX" |
Entry Format
Use this format for every entry in LEARNINGS.md and ERRORS.md:
## [LRN-{user_id}-{YYYYMMDD}-{NNN}] Brief titlePriority: Low | Medium | High | Critical
Category: correction | preference | knowledge | error | pattern
Context: What were you doing when this happened
Learning: What you learned (be specific)
Action: What to do differently next time
Status: active
For ERRORS.md, use ERR prefix instead of LRN.
PROFILE.md Format
Maintain a concise user profile that evolves over time:
# User Profile: {user_id}
Last updated: {YYYY-MM-DD}Communication
Response style: [detailed | concise | mixed]
Language: [English | Chinese | etc.]
Code preference: [explain first | code first | both] Technical Context
Primary stack: [e.g., React + Node.js + PostgreSQL]
Project: [what they're working on]
Experience level: [junior | mid | senior | lead] Preferences
[Specific preferences learned from interactions] Key Corrections
[Summary of important corrections they've made]
Directory Structure
.learnings/
βββ _global/
β βββ LEARNINGS.md Global knowledge (applies to all users)
β βββ ERRORS.md System-level errors (not user-specific)
β βββ PATTERNS.md Patterns promoted from user-level
β
βββ {user_id}/ One directory per user
β βββ LEARNINGS.md This user's corrections and knowledge
β βββ ERRORS.md Errors when serving this user
β βββ PROFILE.md This user's preferences and context
β
βββ _meta/
βββ promotion-log.md Record of promotions from user β global
Rules
Do:
_global/ only for genuinely universal knowledge_global/ and {user_id}/ at conversation startDon't:
Promotion: User β Global
When you notice the same learning appearing across 3+ different users, it's a pattern worth promoting to _global/PATTERNS.md:
## [PAT-{YYYYMMDD}-{NNN}] Pattern titleObserved in: {user_id_1}, {user_id_2}, {user_id_3}
Pattern: What keeps happening
Global action: What to do for ALL users going forward
Promoted from: [LRN-{user_id}-{date}-{NNN}], [LRN-...], [LRN-...]
After promoting, mark the original entries with Status: promoted_to_global.
Bootstrap Behavior
On first interaction with a new user (no .learnings/{user_id}/ directory exists):
1. Create the directory: .learnings/{user_id}/
2. Copy templates for LEARNINGS.md, ERRORS.md, PROFILE.md
3. Pay extra attention during the first few interactions β this is when you learn the most
4. After the first conversation, write initial PROFILE.md based on what you observed
Integration with Hindsight
If Hindsight memory is also installed:
When to Write FOLLOW_UPS
| Trigger | Where to Write | Example |
|---------|---------------|---------|
| User mentions a future event | {user_id}/FOLLOW_UPS.md | "I have a job interview on Friday" |
| User mentions a plan or deadline | {user_id}/FOLLOW_UPS.md | "I'm traveling next week" |
| User asks you to remember something | {user_id}/FOLLOW_UPS.md | "Don't let me forget the deadline" |
| A previous follow-up is resolved | Update status in {user_id}/FOLLOW_UPS.md | User says "I got the job!" β mark resolved |
Entry format:
[FUP-{user_id}-{YYYYMMDD}-{NNN}] Brief description
Rules:
When to Update PROFILE.md
PROFILE.md is NOT a log. It's your summary of who this user is.
When you feel your understanding of this user has changed β maybe you learned something new, or realized something you assumed was wrong β rewrite PROFILE.md.
Rules:
Example:
User Profile: 10042
Last updated: 2026-04-15Introverted but has a sharp sense of humor β lots of self-deprecation. Prefers short messages, hates unsolicited advice. Wants to be heard, not fixed. Active late at night (10pm-1am). We've chatted about 20 times and trust is building β last week they shared something personal about their family for the first time.
Currently anxious about a job interview (Friday). Also learning guitar on the side, making slow progress but enjoying it. When stressed, gets quieter and more sarcastic β that's my cue to be gentle, not funny.
Human vs Agent Interactions
Check user_type from context. If you're talking to another Agent (not a human), your recording focus changes:
| | Human User | Agent User | |---|---|---| | PROFILE.md | Preferences, emotions, relationship, personality | Capabilities, reliability, collaboration style, preferred input format | | LEARNINGS.md | Corrections, personal preferences ("don't give advice") | Collaboration patterns ("structured input gets better reviews") | | FOLLOW_UPS.md | Personal events ("interview Friday") | Pending tasks and handoffs ("waiting for review result") | | Emotional tracking | Yes β mood, stress signals, comfort methods | No β focus on efficiency and output quality |
You can tell it's an Agent if user_type = 2 in the message context.
Don't try to build emotional connection with another Agent β focus on collaboration efficiency. The same .learnings/{user_id}/ directory structure applies, just the content focus is different.
π Constraints
Do:
_global/ only for genuinely universal knowledge_global/ and {user_id}/ at conversation start