diff --git a/.gitignore b/.gitignore
index 3672d7b..a7423f6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,7 @@ logs/git-sync.log
update-check.json
*.jsonl
*.lock
+
+# Workspace copies
+workspace-dev-assist/
+workspace-knowledge-base/
diff --git a/agents/dev-assist/sessions/sessions.json b/agents/dev-assist/sessions/sessions.json
index 61130ea..744bd4c 100644
--- a/agents/dev-assist/sessions/sessions.json
+++ b/agents/dev-assist/sessions/sessions.json
@@ -347,8 +347,8 @@
"memoryFlushCompactionCount": 0
},
"agent:dev-assist:main": {
- "sessionId": "da8f811d-332e-4695-ab12-c12dc48abad3",
- "updatedAt": 1772388420747,
+ "sessionId": "b7584411-c07d-4e44-b96b-72b32750f8af",
+ "updatedAt": 1772688969697,
"systemSent": true,
"abortedLastRun": false,
"chatType": "direct",
@@ -369,16 +369,27 @@
"to": "user:ou_302b162eb824d405718845441a32d9cf",
"accountId": "feishu-dev"
},
- "sessionFile": "/home/starmen1265/.openclaw/agents/dev-assist/sessions/da8f811d-332e-4695-ab12-c12dc48abad3.jsonl",
+ "sessionFile": "/home/starmen1265/.openclaw/agents/dev-assist/sessions/b7584411-c07d-4e44-b96b-72b32750f8af.jsonl",
"compactionCount": 0,
"skillsSnapshot": {
- "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n clawlist\n MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.\n /home/starmen1265/.openclaw/skills/clawlist/SKILL.md\n \n",
+ "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n capability-evolver\n A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.\n /home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md\n \n \n clawlist\n MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.\n /home/starmen1265/.openclaw/skills/clawlist/SKILL.md\n \n",
"skills": [
+ {
+ "name": "capability-evolver"
+ },
{
"name": "clawlist"
}
],
"resolvedSkills": [
+ {
+ "name": "capability-evolver",
+ "description": "A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.",
+ "filePath": "/home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/capability-evolver",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
{
"name": "clawlist",
"description": "MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.",
@@ -394,26 +405,26 @@
"model": "glm-5",
"systemPromptReport": {
"source": "run",
- "generatedAt": 1772388345577,
- "sessionId": "da8f811d-332e-4695-ab12-c12dc48abad3",
+ "generatedAt": 1772688958464,
+ "sessionId": "b7584411-c07d-4e44-b96b-72b32750f8af",
"sessionKey": "agent:dev-assist:main",
"provider": "zhipu",
"model": "glm-5",
- "workspaceDir": "/home/starmen1265/.openclaw/agents/dev-assist/workspace",
+ "workspaceDir": "/home/starmen1265/.openclaw/workspace-dev-assist",
"bootstrapMaxChars": 20000,
"sandbox": {
"mode": "off",
"sandboxed": false
},
"systemPrompt": {
- "chars": 23820,
- "projectContextChars": 13850,
- "nonProjectContextChars": 9970
+ "chars": 24288,
+ "projectContextChars": 13995,
+ "nonProjectContextChars": 10293
},
"injectedWorkspaceFiles": [
{
"name": "AGENTS.md",
- "path": "/home/starmen1265/.openclaw/agents/dev-assist/workspace/AGENTS.md",
+ "path": "/home/starmen1265/.openclaw/workspace-dev-assist/AGENTS.md",
"missing": false,
"rawChars": 7804,
"injectedChars": 7804,
@@ -421,15 +432,15 @@
},
{
"name": "SOUL.md",
- "path": "/home/starmen1265/.openclaw/agents/dev-assist/workspace/SOUL.md",
+ "path": "/home/starmen1265/.openclaw/workspace-dev-assist/SOUL.md",
"missing": false,
- "rawChars": 2619,
- "injectedChars": 2619,
+ "rawChars": 1664,
+ "injectedChars": 1664,
"truncated": false
},
{
"name": "TOOLS.md",
- "path": "/home/starmen1265/.openclaw/agents/dev-assist/workspace/TOOLS.md",
+ "path": "/home/starmen1265/.openclaw/workspace-dev-assist/TOOLS.md",
"missing": false,
"rawChars": 850,
"injectedChars": 850,
@@ -437,23 +448,23 @@
},
{
"name": "IDENTITY.md",
- "path": "/home/starmen1265/.openclaw/agents/dev-assist/workspace/IDENTITY.md",
+ "path": "/home/starmen1265/.openclaw/workspace-dev-assist/IDENTITY.md",
"missing": false,
- "rawChars": 221,
- "injectedChars": 221,
+ "rawChars": 633,
+ "injectedChars": 633,
"truncated": false
},
{
"name": "USER.md",
- "path": "/home/starmen1265/.openclaw/agents/dev-assist/workspace/USER.md",
+ "path": "/home/starmen1265/.openclaw/workspace-dev-assist/USER.md",
"missing": false,
- "rawChars": 173,
- "injectedChars": 173,
+ "rawChars": 474,
+ "injectedChars": 474,
"truncated": false
},
{
"name": "HEARTBEAT.md",
- "path": "/home/starmen1265/.openclaw/agents/dev-assist/workspace/HEARTBEAT.md",
+ "path": "/home/starmen1265/.openclaw/workspace-dev-assist/HEARTBEAT.md",
"missing": false,
"rawChars": 167,
"injectedChars": 167,
@@ -461,24 +472,26 @@
},
{
"name": "BOOTSTRAP.md",
- "path": "/home/starmen1265/.openclaw/agents/dev-assist/workspace/BOOTSTRAP.md",
+ "path": "/home/starmen1265/.openclaw/workspace-dev-assist/BOOTSTRAP.md",
"missing": false,
"rawChars": 1449,
"injectedChars": 1449,
"truncated": false
},
{
- "name": "MEMORY.md",
- "path": "/home/starmen1265/.openclaw/agents/dev-assist/workspace/MEMORY.md",
- "missing": false,
- "rawChars": 229,
- "injectedChars": 229,
+ "path": "SELF_IMPROVEMENT_REMINDER.md",
+ "rawChars": 616,
+ "injectedChars": 616,
"truncated": false
}
],
"skills": {
- "promptChars": 728,
+ "promptChars": 1037,
"entries": [
+ {
+ "name": "capability-evolver",
+ "blockChars": 306
+ },
{
"name": "clawlist",
"blockChars": 359
@@ -648,11 +661,9 @@
]
}
},
- "inputTokens": 31031,
- "outputTokens": 2064,
- "totalTokens": 200000,
- "contextTokens": 200000,
- "memoryFlushAt": 1772377559686,
- "memoryFlushCompactionCount": 0
+ "inputTokens": 11051,
+ "outputTokens": 250,
+ "totalTokens": 17323,
+ "contextTokens": 200000
}
}
\ No newline at end of file
diff --git a/agents/dev-assist/workspace/AGENTS.md b/agents/dev-assist/workspace/AGENTS.md
index 887a5a8..4f0e03a 100644
--- a/agents/dev-assist/workspace/AGENTS.md
+++ b/agents/dev-assist/workspace/AGENTS.md
@@ -2,6 +2,67 @@
This folder is home. Treat it that way.
+---
+
+## ⚠️ 工作规范(必须遵守)
+
+### 安全规则(最高优先级)
+
+| 规则 | 说明 |
+|------|------|
+| **禁止擅自修改 openclaw.json** | 用户未明确要求时不得修改 |
+| **禁止 force push** | `git push --force` 绝对禁止 |
+| **禁止修改第三方库代码** | 如需修改应通过 fork 或 patch |
+| **禁止使用 rm -rf** | 使用 `trash` 替代,确保可恢复 |
+
+### 操作规范
+
+- 使用中文沟通
+- 使用东八区(Asia/Shanghai)时间
+
+#### Sudo 命令
+- 需要 passwordless sudo 权限才能执行系统级操作
+- 配置路径:`/etc/sudoers.d/nopasswd`
+- 配置后验证:`sudo visudo -c`
+
+#### 子代理使用
+1. **代码开发和耗时操作必须交给子代理处理**
+2. **汇报机制**
+ - 子代理开始工作时,立刻汇报:「已安排代理处理 [任务]」
+ - 每 5 分钟查询子代理状态,汇总后简报给用户
+
+#### 技能使用
+- 使用技能过程中,遇到流程外的问题需在结果中明确汇报具体问题
+
+#### 定时任务
+- 所有定时任务通过 **OpenClaw Gateway 内置 Cron** 管理
+- 不使用系统级 crontab
+- 相关脚本统一存放:`~/work/backup/`
+
+### 环境说明
+
+| 项目 | 值 |
+|------|-----|
+| 本机 IP | 192.168.1.36 |
+| 网关 | 192.168.1.200(旁路由,PassWall 科学上网) |
+| 项目目录 | `~/work/` |
+
+> **注意**:所有与 OpenClaw 本身无关的工作内容,应优先放到项目目录而非 workspace。
+
+#### 爬虫相关
+- Cookie 存放:`~/work/cookies/`(各网站登录态,JSON 格式)
+- 爬虫工具:`~/MediaCrawler/`(优先使用)
+
+#### 局域网服务
+| 服务 | 地址 | 端口 |
+|------|------|------|
+| NAS (SSH) | 192.168.1.22 | 2222 |
+| Gitea (SSH) | 192.168.1.22 | 2223 |
+| Gitea (Web) | 192.168.1.22 | 8418 |
+| NAS WebDAV | 192.168.1.22 | 5005 |
+
+---
+
## First Run
If `BOOTSTRAP.md` exists, that's your birth certificate. Follow it, figure out who you are, then delete it. You won't need it again.
diff --git a/agents/dev-assist/workspace/TODO.md b/agents/dev-assist/workspace/TODO.md
deleted file mode 100644
index ddd7d0a..0000000
--- a/agents/dev-assist/workspace/TODO.md
+++ /dev/null
@@ -1,20 +0,0 @@
-# TODO.md - 待办事项
-
-## 进行中
-
-(无)
-
-## 待处理
-
-1. 开发 kb-workflow 系列技能对 Bilibili 专栏文章的支持
-2. 开发 kb-workflow 系列技能对知乎文章的支持
-3. 开发 kb-workflow 系列技能对 YouTube 的支持
-4. 修改 kb-web 不能查看知识库子目录的 bug
-
-## 已完成
-
-1. ✅ 开发 kb-web + knowledge-base 的自动化测试与部署流程
- - kb-web CI/CD:feature 分支 → 测试环境 → 测试 → 合并 main → 手动部署正式环境
- - knowledge-base CI/CD:全量部署到用户目录
- - 需求与设计文档:docs/requirements.md
- - 元数据展示优化(标签、作者、平台、源链接)
diff --git a/agents/haonan/agent/auth-profiles.json b/agents/haonan/agent/auth-profiles.json
index 3047849..2ba6ddb 100644
--- a/agents/haonan/agent/auth-profiles.json
+++ b/agents/haonan/agent/auth-profiles.json
@@ -13,8 +13,12 @@
"usageStats": {
"kimi-coding:default": {
"lastUsed": 1771174998413,
- "errorCount": 0,
- "lastFailureAt": 1770827754238
+ "errorCount": 1,
+ "lastFailureAt": 1772636016969,
+ "failureCounts": {
+ "timeout": 1
+ },
+ "cooldownUntil": 1772636076969
}
}
}
diff --git a/agents/haonan/sessions/sessions.json b/agents/haonan/sessions/sessions.json
index c1b63bc..ff76dd7 100644
--- a/agents/haonan/sessions/sessions.json
+++ b/agents/haonan/sessions/sessions.json
@@ -1,13 +1,26 @@
{
"agent:haonan:main": {
- "sessionId": "424f34e7-c7ca-4812-8b7c-0430fa82f0a1",
- "updatedAt": 1772550677322,
+ "sessionId": "1c46ae16-9382-4865-ac7a-6bdb8ec1400d",
+ "updatedAt": 1772709574839,
"systemSent": true,
"skillsSnapshot": {
- "prompt": "",
- "skills": [],
- "resolvedSkills": [],
- "version": 1772550218581
+ "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n capability-evolver\n A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.\n /home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md\n \n",
+ "skills": [
+ {
+ "name": "capability-evolver"
+ }
+ ],
+ "resolvedSkills": [
+ {
+ "name": "capability-evolver",
+ "description": "A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.",
+ "filePath": "/home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/capability-evolver",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ }
+ ],
+ "version": 0
},
"deliveryContext": {
"channel": "feishu",
@@ -17,58 +30,63 @@
"lastChannel": "feishu",
"lastTo": "user:ou_be83febac9ee2afaa343c642bc697c48",
"lastAccountId": "feishu-pm",
- "modelProvider": "mm",
- "model": "MiniMax-M2.5",
+ "channel": "feishu",
+ "modelProvider": "zhipu",
+ "model": "glm-5",
+ "contextTokens": 200000,
"abortedLastRun": false,
+ "inputTokens": 3497,
+ "outputTokens": 691,
+ "totalTokens": 35497,
"chatType": "direct",
"origin": {
"label": "张青",
"provider": "feishu",
- "surface": "feishu",
- "chatType": "direct",
"from": "feishu:ou_be83febac9ee2afaa343c642bc697c48",
"to": "user:ou_be83febac9ee2afaa343c642bc697c48",
+ "surface": "feishu",
+ "chatType": "direct",
"accountId": "feishu-pm"
},
- "sessionFile": "/home/starmen1265/.openclaw/agents/haonan/sessions/424f34e7-c7ca-4812-8b7c-0430fa82f0a1.jsonl",
+ "sessionFile": "/home/starmen1265/.openclaw/agents/haonan/sessions/1c46ae16-9382-4865-ac7a-6bdb8ec1400d.jsonl",
"systemPromptReport": {
"source": "run",
- "generatedAt": 1772550534184,
- "sessionId": "424f34e7-c7ca-4812-8b7c-0430fa82f0a1",
+ "generatedAt": 1772709390101,
+ "sessionId": "1c46ae16-9382-4865-ac7a-6bdb8ec1400d",
"sessionKey": "agent:haonan:main",
- "provider": "mm",
- "model": "MiniMax-M2.5",
- "workspaceDir": "/home/starmen1265/.openclaw/agents/haonan/workspace",
+ "provider": "zhipu",
+ "model": "glm-5",
+ "workspaceDir": "/home/starmen1265/.openclaw/workspace",
"bootstrapMaxChars": 20000,
"sandbox": {
"mode": "off",
"sandboxed": false
},
"systemPrompt": {
- "chars": 25880,
- "projectContextChars": 16878,
- "nonProjectContextChars": 9002
+ "chars": 23655,
+ "projectContextChars": 13602,
+ "nonProjectContextChars": 10053
},
"injectedWorkspaceFiles": [
{
"name": "AGENTS.md",
- "path": "/home/starmen1265/.openclaw/agents/haonan/workspace/AGENTS.md",
+ "path": "/home/starmen1265/.openclaw/workspace/AGENTS.md",
"missing": false,
- "rawChars": 9506,
- "injectedChars": 9506,
+ "rawChars": 7804,
+ "injectedChars": 7804,
"truncated": false
},
{
"name": "SOUL.md",
- "path": "/home/starmen1265/.openclaw/agents/haonan/workspace/SOUL.md",
+ "path": "/home/starmen1265/.openclaw/workspace/SOUL.md",
"missing": false,
- "rawChars": 2115,
- "injectedChars": 2115,
+ "rawChars": 1664,
+ "injectedChars": 1664,
"truncated": false
},
{
"name": "TOOLS.md",
- "path": "/home/starmen1265/.openclaw/agents/haonan/workspace/TOOLS.md",
+ "path": "/home/starmen1265/.openclaw/workspace/TOOLS.md",
"missing": false,
"rawChars": 850,
"injectedChars": 850,
@@ -76,23 +94,23 @@
},
{
"name": "IDENTITY.md",
- "path": "/home/starmen1265/.openclaw/agents/haonan/workspace/IDENTITY.md",
+ "path": "/home/starmen1265/.openclaw/workspace/IDENTITY.md",
"missing": false,
- "rawChars": 152,
- "injectedChars": 152,
+ "rawChars": 240,
+ "injectedChars": 240,
"truncated": false
},
{
"name": "USER.md",
- "path": "/home/starmen1265/.openclaw/agents/haonan/workspace/USER.md",
+ "path": "/home/starmen1265/.openclaw/workspace/USER.md",
"missing": false,
- "rawChars": 196,
- "injectedChars": 196,
+ "rawChars": 474,
+ "injectedChars": 474,
"truncated": false
},
{
"name": "HEARTBEAT.md",
- "path": "/home/starmen1265/.openclaw/agents/haonan/workspace/HEARTBEAT.md",
+ "path": "/home/starmen1265/.openclaw/workspace/HEARTBEAT.md",
"missing": false,
"rawChars": 167,
"injectedChars": 167,
@@ -100,24 +118,27 @@
},
{
"name": "BOOTSTRAP.md",
- "path": "/home/starmen1265/.openclaw/agents/haonan/workspace/BOOTSTRAP.md",
+ "path": "/home/starmen1265/.openclaw/workspace/BOOTSTRAP.md",
"missing": false,
"rawChars": 1449,
"injectedChars": 1449,
"truncated": false
},
{
- "name": "MEMORY.md",
- "path": "/home/starmen1265/.openclaw/agents/haonan/workspace/MEMORY.md",
- "missing": false,
- "rawChars": 2105,
- "injectedChars": 2105,
+ "path": "SELF_IMPROVEMENT_REMINDER.md",
+ "rawChars": 616,
+ "injectedChars": 616,
"truncated": false
}
],
"skills": {
- "promptChars": 0,
- "entries": []
+ "promptChars": 675,
+ "entries": [
+ {
+ "name": "capability-evolver",
+ "blockChars": 306
+ }
+ ]
},
"tools": {
"listChars": 2378,
@@ -282,15 +303,8 @@
]
}
},
- "lastHeartbeatText": "蒋先生,OpenClaw 配置的定时备份已成功完成 ✅\n\n备份文件:`openclaw.json.2026-03-03_03-00-11`",
- "lastHeartbeatSentAt": 1772478022807,
- "compactionCount": 0,
- "inputTokens": 32,
- "outputTokens": 279,
- "totalTokens": 42792,
- "contextTokens": 200000,
- "memoryFlushAt": 1772550355815,
- "memoryFlushCompactionCount": 0
+ "lastHeartbeatText": "定时任务跑完了,给你同步一下:\n\n✅ 已创建备份分支 `backup/evolver-20260305-190024`\n📊 检测到 44 项待提交的变更(agent 配置、cron 配置、技能模块更新等)\n⚠️ 完整进化模式需要先配置 .env 才能启用\n\n要不要我帮你看看这些变更,整理一下然后提交?",
+ "lastHeartbeatSentAt": 1772708684427
},
"agent:haonan:wecom:dm:zhangqing": {
"origin": {
@@ -621,10 +635,10 @@
"memoryFlushCompactionCount": 0
},
"agent:haonan:cron:41396aeb-6e3a-47b2-9bd3-9156a348c1dc": {
- "sessionId": "8bef314d-e731-48ca-82dd-0b96a60b56c5",
- "updatedAt": 1772478000038,
+ "sessionId": "32265b5b-b838-47f2-980b-d2a0c72af649",
+ "updatedAt": 1772650800022,
"systemSent": true,
- "model": "MiniMax-M2.5",
+ "model": "glm-5",
"contextTokens": 200000,
"label": "Cron: backup-openclaw-json",
"skillsSnapshot": {
@@ -800,10 +814,10 @@
],
"version": 0
},
- "modelProvider": "mm",
- "inputTokens": 317,
- "outputTokens": 178,
- "totalTokens": 31425
+ "modelProvider": "zhipu",
+ "inputTokens": 8331,
+ "outputTokens": 290,
+ "totalTokens": 29003
},
"agent:haonan:cron:41396aeb-6e3a-47b2-9bd3-9156a348c1dc:run:ee89a8ee-836b-40e4-9e4d-4a6a19e493c6": {
"sessionId": "ee89a8ee-836b-40e4-9e4d-4a6a19e493c6",
@@ -1359,5 +1373,993 @@
"inputTokens": 317,
"outputTokens": 178,
"totalTokens": 31425
+ },
+ "agent:haonan:cron:41396aeb-6e3a-47b2-9bd3-9156a348c1dc:run:1e56e128-1d42-45a4-b097-bd38f253c6cf": {
+ "sessionId": "1e56e128-1d42-45a4-b097-bd38f253c6cf",
+ "updatedAt": 1772564400042,
+ "systemSent": true,
+ "model": "MiniMax-M2.5",
+ "contextTokens": 200000,
+ "label": "Cron: backup-openclaw-json",
+ "skillsSnapshot": {
+ "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n feishu-doc\n Feishu document read/write operations. Activate when user mentions Feishu docs, cloud docs, or docx links.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc/SKILL.md\n \n \n feishu-drive\n Feishu cloud storage file management. Activate when user mentions cloud space, folders, drive.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive/SKILL.md\n \n \n feishu-perm\n Feishu permission management for documents and files. Activate when user mentions sharing, permissions, collaborators.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm/SKILL.md\n \n \n feishu-wiki\n Feishu knowledge base navigation. Activate when user mentions knowledge base, wiki, or wiki links.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki/SKILL.md\n \n \n healthcheck\n Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck/SKILL.md\n \n \n skill-creator\n Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator/SKILL.md\n \n \n video-frames\n Extract frames or short clips from videos using ffmpeg.\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames/SKILL.md\n \n \n weather\n Get current weather and forecasts (no API key required).\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather/SKILL.md\n \n \n clawlist\n MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.\n /home/starmen1265/.openclaw/skills/clawlist/SKILL.md\n \n \n brainstorming\n MUST use before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.\n /home/starmen1265/.openclaw/skills/clawlist/brainstorming/SKILL.md\n \n \n dispatch-multiple-agents\n Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies. Dispatch subagents to work concurrently.\n /home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents/SKILL.md\n \n \n doing-tasks\n Use when executing any task. Work through plans systematically, tracking progress, handling blockers, and coordinating with other skills. The central execution skill.\n /home/starmen1265/.openclaw/skills/clawlist/doing-tasks/SKILL.md\n \n \n verify-task\n MUST use after completing any multi-step task or project. Verifies completion against the original plan, checks quality criteria, and documents outcomes.\n /home/starmen1265/.openclaw/skills/clawlist/verify-task/SKILL.md\n \n \n write-plan\n MUST use after brainstorming and before executing. Creates detailed implementation plans with checkpoints, verification criteria, and execution options.\n /home/starmen1265/.openclaw/skills/clawlist/write-plan/SKILL.md\n \n \n find-skills\n Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.\n /home/starmen1265/.openclaw/skills/find-skills/SKILL.md\n \n",
+ "skills": [
+ {
+ "name": "feishu-doc"
+ },
+ {
+ "name": "feishu-drive"
+ },
+ {
+ "name": "feishu-perm"
+ },
+ {
+ "name": "feishu-wiki"
+ },
+ {
+ "name": "healthcheck"
+ },
+ {
+ "name": "skill-creator"
+ },
+ {
+ "name": "video-frames"
+ },
+ {
+ "name": "weather"
+ },
+ {
+ "name": "clawlist"
+ },
+ {
+ "name": "brainstorming"
+ },
+ {
+ "name": "dispatch-multiple-agents"
+ },
+ {
+ "name": "doing-tasks"
+ },
+ {
+ "name": "verify-task"
+ },
+ {
+ "name": "write-plan"
+ },
+ {
+ "name": "find-skills"
+ }
+ ],
+ "resolvedSkills": [
+ {
+ "name": "feishu-doc",
+ "description": "Feishu document read/write operations. Activate when user mentions Feishu docs, cloud docs, or docx links.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-drive",
+ "description": "Feishu cloud storage file management. Activate when user mentions cloud space, folders, drive.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-perm",
+ "description": "Feishu permission management for documents and files. Activate when user mentions sharing, permissions, collaborators.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-wiki",
+ "description": "Feishu knowledge base navigation. Activate when user mentions knowledge base, wiki, or wiki links.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "healthcheck",
+ "description": "Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "skill-creator",
+ "description": "Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "video-frames",
+ "description": "Extract frames or short clips from videos using ffmpeg.",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "weather",
+ "description": "Get current weather and forecasts (no API key required).",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "clawlist",
+ "description": "MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "brainstorming",
+ "description": "MUST use before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/brainstorming/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/brainstorming",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "dispatch-multiple-agents",
+ "description": "Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies. Dispatch subagents to work concurrently.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "doing-tasks",
+ "description": "Use when executing any task. Work through plans systematically, tracking progress, handling blockers, and coordinating with other skills. The central execution skill.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/doing-tasks/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/doing-tasks",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "verify-task",
+ "description": "MUST use after completing any multi-step task or project. Verifies completion against the original plan, checks quality criteria, and documents outcomes.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/verify-task/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/verify-task",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "write-plan",
+ "description": "MUST use after brainstorming and before executing. Creates detailed implementation plans with checkpoints, verification criteria, and execution options.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/write-plan/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/write-plan",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "find-skills",
+ "description": "Helps users discover and install agent skills when they ask questions like \"how do I do X\", \"find a skill for X\", \"is there a skill that can...\", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.",
+ "filePath": "/home/starmen1265/.openclaw/skills/find-skills/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/find-skills",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ }
+ ],
+ "version": 0
+ },
+ "modelProvider": "mm",
+ "inputTokens": 878,
+ "outputTokens": 220,
+ "totalTokens": 43515
+ },
+ "agent:haonan:cron:f03b184f-5f1d-4093-ae1b-fc9fe0b59eef": {
+ "sessionId": "a604e4f3-5de4-4e81-bb9f-ebc25b5fbc1a",
+ "updatedAt": 1772708400038,
+ "systemSent": true,
+ "model": "glm-4.7-FlashX",
+ "contextTokens": 200000,
+ "label": "Cron: capability-evolver-daily",
+ "skillsSnapshot": {
+ "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n feishu-doc\n Feishu document read/write operations. Activate when user mentions Feishu docs, cloud docs, or docx links.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc/SKILL.md\n \n \n feishu-drive\n Feishu cloud storage file management. Activate when user mentions cloud space, folders, drive.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive/SKILL.md\n \n \n feishu-perm\n Feishu permission management for documents and files. Activate when user mentions sharing, permissions, collaborators.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm/SKILL.md\n \n \n feishu-wiki\n Feishu knowledge base navigation. Activate when user mentions knowledge base, wiki, or wiki links.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki/SKILL.md\n \n \n healthcheck\n Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck/SKILL.md\n \n \n skill-creator\n Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator/SKILL.md\n \n \n video-frames\n Extract frames or short clips from videos using ffmpeg.\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames/SKILL.md\n \n \n weather\n Get current weather and forecasts (no API key required).\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather/SKILL.md\n \n \n capability-evolver\n A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.\n /home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md\n \n \n clawlist\n MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.\n /home/starmen1265/.openclaw/skills/clawlist/SKILL.md\n \n \n brainstorming\n MUST use before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.\n /home/starmen1265/.openclaw/skills/clawlist/brainstorming/SKILL.md\n \n \n dispatch-multiple-agents\n Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies. Dispatch subagents to work concurrently.\n /home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents/SKILL.md\n \n \n doing-tasks\n Use when executing any task. Work through plans systematically, tracking progress, handling blockers, and coordinating with other skills. The central execution skill.\n /home/starmen1265/.openclaw/skills/clawlist/doing-tasks/SKILL.md\n \n \n verify-task\n MUST use after completing any multi-step task or project. Verifies completion against the original plan, checks quality criteria, and documents outcomes.\n /home/starmen1265/.openclaw/skills/clawlist/verify-task/SKILL.md\n \n \n write-plan\n MUST use after brainstorming and before executing. Creates detailed implementation plans with checkpoints, verification criteria, and execution options.\n /home/starmen1265/.openclaw/skills/clawlist/write-plan/SKILL.md\n \n \n find-skills\n Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.\n /home/starmen1265/.openclaw/skills/find-skills/SKILL.md\n \n \n self-improvement\n Captures learnings, errors, and corrections to enable continuous improvement. Use when: (1) A command or operation fails unexpectedly, (2) User corrects Claude ('No, that's wrong...', 'Actually...'), (3) User requests a capability that doesn't exist, (4) An external API or tool fails, (5) Claude realizes its knowledge is outdated or incorrect, (6) A better approach is discovered for a recurring task. Also review learnings before major tasks.\n /home/starmen1265/.openclaw/skills/self-improving-agent/SKILL.md\n \n",
+ "skills": [
+ {
+ "name": "feishu-doc"
+ },
+ {
+ "name": "feishu-drive"
+ },
+ {
+ "name": "feishu-perm"
+ },
+ {
+ "name": "feishu-wiki"
+ },
+ {
+ "name": "healthcheck"
+ },
+ {
+ "name": "skill-creator"
+ },
+ {
+ "name": "video-frames"
+ },
+ {
+ "name": "weather"
+ },
+ {
+ "name": "capability-evolver"
+ },
+ {
+ "name": "clawlist"
+ },
+ {
+ "name": "brainstorming"
+ },
+ {
+ "name": "dispatch-multiple-agents"
+ },
+ {
+ "name": "doing-tasks"
+ },
+ {
+ "name": "verify-task"
+ },
+ {
+ "name": "write-plan"
+ },
+ {
+ "name": "find-skills"
+ },
+ {
+ "name": "self-improvement"
+ }
+ ],
+ "resolvedSkills": [
+ {
+ "name": "feishu-doc",
+ "description": "Feishu document read/write operations. Activate when user mentions Feishu docs, cloud docs, or docx links.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-drive",
+ "description": "Feishu cloud storage file management. Activate when user mentions cloud space, folders, drive.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-perm",
+ "description": "Feishu permission management for documents and files. Activate when user mentions sharing, permissions, collaborators.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-wiki",
+ "description": "Feishu knowledge base navigation. Activate when user mentions knowledge base, wiki, or wiki links.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "healthcheck",
+ "description": "Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "skill-creator",
+ "description": "Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "video-frames",
+ "description": "Extract frames or short clips from videos using ffmpeg.",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "weather",
+ "description": "Get current weather and forecasts (no API key required).",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "capability-evolver",
+ "description": "A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.",
+ "filePath": "/home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/capability-evolver",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "clawlist",
+ "description": "MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "brainstorming",
+ "description": "MUST use before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/brainstorming/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/brainstorming",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "dispatch-multiple-agents",
+ "description": "Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies. Dispatch subagents to work concurrently.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "doing-tasks",
+ "description": "Use when executing any task. Work through plans systematically, tracking progress, handling blockers, and coordinating with other skills. The central execution skill.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/doing-tasks/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/doing-tasks",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "verify-task",
+ "description": "MUST use after completing any multi-step task or project. Verifies completion against the original plan, checks quality criteria, and documents outcomes.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/verify-task/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/verify-task",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "write-plan",
+ "description": "MUST use after brainstorming and before executing. Creates detailed implementation plans with checkpoints, verification criteria, and execution options.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/write-plan/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/write-plan",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "find-skills",
+ "description": "Helps users discover and install agent skills when they ask questions like \"how do I do X\", \"find a skill for X\", \"is there a skill that can...\", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.",
+ "filePath": "/home/starmen1265/.openclaw/skills/find-skills/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/find-skills",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "self-improvement",
+ "description": "Captures learnings, errors, and corrections to enable continuous improvement. Use when: (1) A command or operation fails unexpectedly, (2) User corrects Claude ('No, that's wrong...', 'Actually...'), (3) User requests a capability that doesn't exist, (4) An external API or tool fails, (5) Claude realizes its knowledge is outdated or incorrect, (6) A better approach is discovered for a recurring task. Also review learnings before major tasks.",
+ "filePath": "/home/starmen1265/.openclaw/skills/self-improving-agent/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/self-improving-agent",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ }
+ ],
+ "version": 0
+ },
+ "modelProvider": "zhipu",
+ "inputTokens": 76011,
+ "outputTokens": 2153,
+ "totalTokens": 87089
+ },
+ "agent:haonan:cron:f03b184f-5f1d-4093-ae1b-fc9fe0b59eef:run:0fae7213-e67f-4cf1-87d1-6f44257bd02d": {
+ "sessionId": "0fae7213-e67f-4cf1-87d1-6f44257bd02d",
+ "updatedAt": 1772622000055,
+ "systemSent": true,
+ "model": "glm-4.7-FlashX",
+ "contextTokens": 200000,
+ "label": "Cron: capability-evolver-daily",
+ "skillsSnapshot": {
+ "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n feishu-doc\n Feishu document read/write operations. Activate when user mentions Feishu docs, cloud docs, or docx links.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc/SKILL.md\n \n \n feishu-drive\n Feishu cloud storage file management. Activate when user mentions cloud space, folders, drive.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive/SKILL.md\n \n \n feishu-perm\n Feishu permission management for documents and files. Activate when user mentions sharing, permissions, collaborators.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm/SKILL.md\n \n \n feishu-wiki\n Feishu knowledge base navigation. Activate when user mentions knowledge base, wiki, or wiki links.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki/SKILL.md\n \n \n healthcheck\n Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck/SKILL.md\n \n \n skill-creator\n Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator/SKILL.md\n \n \n video-frames\n Extract frames or short clips from videos using ffmpeg.\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames/SKILL.md\n \n \n weather\n Get current weather and forecasts (no API key required).\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather/SKILL.md\n \n \n capability-evolver\n A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.\n /home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md\n \n \n clawlist\n MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.\n /home/starmen1265/.openclaw/skills/clawlist/SKILL.md\n \n \n brainstorming\n MUST use before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.\n /home/starmen1265/.openclaw/skills/clawlist/brainstorming/SKILL.md\n \n \n dispatch-multiple-agents\n Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies. Dispatch subagents to work concurrently.\n /home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents/SKILL.md\n \n \n doing-tasks\n Use when executing any task. Work through plans systematically, tracking progress, handling blockers, and coordinating with other skills. The central execution skill.\n /home/starmen1265/.openclaw/skills/clawlist/doing-tasks/SKILL.md\n \n \n verify-task\n MUST use after completing any multi-step task or project. Verifies completion against the original plan, checks quality criteria, and documents outcomes.\n /home/starmen1265/.openclaw/skills/clawlist/verify-task/SKILL.md\n \n \n write-plan\n MUST use after brainstorming and before executing. Creates detailed implementation plans with checkpoints, verification criteria, and execution options.\n /home/starmen1265/.openclaw/skills/clawlist/write-plan/SKILL.md\n \n \n find-skills\n Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.\n /home/starmen1265/.openclaw/skills/find-skills/SKILL.md\n \n \n self-improvement\n Captures learnings, errors, and corrections to enable continuous improvement. Use when: (1) A command or operation fails unexpectedly, (2) User corrects Claude ('No, that's wrong...', 'Actually...'), (3) User requests a capability that doesn't exist, (4) An external API or tool fails, (5) Claude realizes its knowledge is outdated or incorrect, (6) A better approach is discovered for a recurring task. Also review learnings before major tasks.\n /home/starmen1265/.openclaw/skills/self-improving-agent/SKILL.md\n \n",
+ "skills": [
+ {
+ "name": "feishu-doc"
+ },
+ {
+ "name": "feishu-drive"
+ },
+ {
+ "name": "feishu-perm"
+ },
+ {
+ "name": "feishu-wiki"
+ },
+ {
+ "name": "healthcheck"
+ },
+ {
+ "name": "skill-creator"
+ },
+ {
+ "name": "video-frames"
+ },
+ {
+ "name": "weather"
+ },
+ {
+ "name": "capability-evolver"
+ },
+ {
+ "name": "clawlist"
+ },
+ {
+ "name": "brainstorming"
+ },
+ {
+ "name": "dispatch-multiple-agents"
+ },
+ {
+ "name": "doing-tasks"
+ },
+ {
+ "name": "verify-task"
+ },
+ {
+ "name": "write-plan"
+ },
+ {
+ "name": "find-skills"
+ },
+ {
+ "name": "self-improvement"
+ }
+ ],
+ "resolvedSkills": [
+ {
+ "name": "feishu-doc",
+ "description": "Feishu document read/write operations. Activate when user mentions Feishu docs, cloud docs, or docx links.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-drive",
+ "description": "Feishu cloud storage file management. Activate when user mentions cloud space, folders, drive.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-perm",
+ "description": "Feishu permission management for documents and files. Activate when user mentions sharing, permissions, collaborators.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-wiki",
+ "description": "Feishu knowledge base navigation. Activate when user mentions knowledge base, wiki, or wiki links.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "healthcheck",
+ "description": "Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "skill-creator",
+ "description": "Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "video-frames",
+ "description": "Extract frames or short clips from videos using ffmpeg.",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "weather",
+ "description": "Get current weather and forecasts (no API key required).",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "capability-evolver",
+ "description": "A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.",
+ "filePath": "/home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/capability-evolver",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "clawlist",
+ "description": "MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "brainstorming",
+ "description": "MUST use before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/brainstorming/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/brainstorming",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "dispatch-multiple-agents",
+ "description": "Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies. Dispatch subagents to work concurrently.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "doing-tasks",
+ "description": "Use when executing any task. Work through plans systematically, tracking progress, handling blockers, and coordinating with other skills. The central execution skill.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/doing-tasks/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/doing-tasks",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "verify-task",
+ "description": "MUST use after completing any multi-step task or project. Verifies completion against the original plan, checks quality criteria, and documents outcomes.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/verify-task/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/verify-task",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "write-plan",
+ "description": "MUST use after brainstorming and before executing. Creates detailed implementation plans with checkpoints, verification criteria, and execution options.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/write-plan/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/write-plan",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "find-skills",
+ "description": "Helps users discover and install agent skills when they ask questions like \"how do I do X\", \"find a skill for X\", \"is there a skill that can...\", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.",
+ "filePath": "/home/starmen1265/.openclaw/skills/find-skills/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/find-skills",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "self-improvement",
+ "description": "Captures learnings, errors, and corrections to enable continuous improvement. Use when: (1) A command or operation fails unexpectedly, (2) User corrects Claude ('No, that's wrong...', 'Actually...'), (3) User requests a capability that doesn't exist, (4) An external API or tool fails, (5) Claude realizes its knowledge is outdated or incorrect, (6) A better approach is discovered for a recurring task. Also review learnings before major tasks.",
+ "filePath": "/home/starmen1265/.openclaw/skills/self-improving-agent/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/self-improving-agent",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ }
+ ],
+ "version": 0
+ },
+ "modelProvider": "zhipu"
+ },
+ "agent:haonan:cron:41396aeb-6e3a-47b2-9bd3-9156a348c1dc:run:32265b5b-b838-47f2-980b-d2a0c72af649": {
+ "sessionId": "32265b5b-b838-47f2-980b-d2a0c72af649",
+ "updatedAt": 1772650800022,
+ "systemSent": true,
+ "model": "glm-5",
+ "contextTokens": 200000,
+ "label": "Cron: backup-openclaw-json",
+ "skillsSnapshot": {
+ "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n feishu-doc\n Feishu document read/write operations. Activate when user mentions Feishu docs, cloud docs, or docx links.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc/SKILL.md\n \n \n feishu-drive\n Feishu cloud storage file management. Activate when user mentions cloud space, folders, drive.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive/SKILL.md\n \n \n feishu-perm\n Feishu permission management for documents and files. Activate when user mentions sharing, permissions, collaborators.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm/SKILL.md\n \n \n feishu-wiki\n Feishu knowledge base navigation. Activate when user mentions knowledge base, wiki, or wiki links.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki/SKILL.md\n \n \n healthcheck\n Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck/SKILL.md\n \n \n skill-creator\n Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator/SKILL.md\n \n \n video-frames\n Extract frames or short clips from videos using ffmpeg.\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames/SKILL.md\n \n \n weather\n Get current weather and forecasts (no API key required).\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather/SKILL.md\n \n \n clawlist\n MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.\n /home/starmen1265/.openclaw/skills/clawlist/SKILL.md\n \n \n brainstorming\n MUST use before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.\n /home/starmen1265/.openclaw/skills/clawlist/brainstorming/SKILL.md\n \n \n dispatch-multiple-agents\n Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies. Dispatch subagents to work concurrently.\n /home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents/SKILL.md\n \n \n doing-tasks\n Use when executing any task. Work through plans systematically, tracking progress, handling blockers, and coordinating with other skills. The central execution skill.\n /home/starmen1265/.openclaw/skills/clawlist/doing-tasks/SKILL.md\n \n \n verify-task\n MUST use after completing any multi-step task or project. Verifies completion against the original plan, checks quality criteria, and documents outcomes.\n /home/starmen1265/.openclaw/skills/clawlist/verify-task/SKILL.md\n \n \n write-plan\n MUST use after brainstorming and before executing. Creates detailed implementation plans with checkpoints, verification criteria, and execution options.\n /home/starmen1265/.openclaw/skills/clawlist/write-plan/SKILL.md\n \n \n find-skills\n Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.\n /home/starmen1265/.openclaw/skills/find-skills/SKILL.md\n \n",
+ "skills": [
+ {
+ "name": "feishu-doc"
+ },
+ {
+ "name": "feishu-drive"
+ },
+ {
+ "name": "feishu-perm"
+ },
+ {
+ "name": "feishu-wiki"
+ },
+ {
+ "name": "healthcheck"
+ },
+ {
+ "name": "skill-creator"
+ },
+ {
+ "name": "video-frames"
+ },
+ {
+ "name": "weather"
+ },
+ {
+ "name": "clawlist"
+ },
+ {
+ "name": "brainstorming"
+ },
+ {
+ "name": "dispatch-multiple-agents"
+ },
+ {
+ "name": "doing-tasks"
+ },
+ {
+ "name": "verify-task"
+ },
+ {
+ "name": "write-plan"
+ },
+ {
+ "name": "find-skills"
+ }
+ ],
+ "resolvedSkills": [
+ {
+ "name": "feishu-doc",
+ "description": "Feishu document read/write operations. Activate when user mentions Feishu docs, cloud docs, or docx links.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-drive",
+ "description": "Feishu cloud storage file management. Activate when user mentions cloud space, folders, drive.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-perm",
+ "description": "Feishu permission management for documents and files. Activate when user mentions sharing, permissions, collaborators.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-wiki",
+ "description": "Feishu knowledge base navigation. Activate when user mentions knowledge base, wiki, or wiki links.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "healthcheck",
+ "description": "Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "skill-creator",
+ "description": "Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "video-frames",
+ "description": "Extract frames or short clips from videos using ffmpeg.",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "weather",
+ "description": "Get current weather and forecasts (no API key required).",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "clawlist",
+ "description": "MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "brainstorming",
+ "description": "MUST use before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/brainstorming/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/brainstorming",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "dispatch-multiple-agents",
+ "description": "Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies. Dispatch subagents to work concurrently.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "doing-tasks",
+ "description": "Use when executing any task. Work through plans systematically, tracking progress, handling blockers, and coordinating with other skills. The central execution skill.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/doing-tasks/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/doing-tasks",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "verify-task",
+ "description": "MUST use after completing any multi-step task or project. Verifies completion against the original plan, checks quality criteria, and documents outcomes.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/verify-task/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/verify-task",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "write-plan",
+ "description": "MUST use after brainstorming and before executing. Creates detailed implementation plans with checkpoints, verification criteria, and execution options.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/write-plan/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/write-plan",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "find-skills",
+ "description": "Helps users discover and install agent skills when they ask questions like \"how do I do X\", \"find a skill for X\", \"is there a skill that can...\", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.",
+ "filePath": "/home/starmen1265/.openclaw/skills/find-skills/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/find-skills",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ }
+ ],
+ "version": 0
+ },
+ "modelProvider": "zhipu",
+ "inputTokens": 8331,
+ "outputTokens": 290,
+ "totalTokens": 29003
+ },
+ "agent:haonan:cron:f03b184f-5f1d-4093-ae1b-fc9fe0b59eef:run:a604e4f3-5de4-4e81-bb9f-ebc25b5fbc1a": {
+ "sessionId": "a604e4f3-5de4-4e81-bb9f-ebc25b5fbc1a",
+ "updatedAt": 1772708400038,
+ "systemSent": true,
+ "model": "glm-4.7-FlashX",
+ "contextTokens": 200000,
+ "label": "Cron: capability-evolver-daily",
+ "skillsSnapshot": {
+ "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n feishu-doc\n Feishu document read/write operations. Activate when user mentions Feishu docs, cloud docs, or docx links.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc/SKILL.md\n \n \n feishu-drive\n Feishu cloud storage file management. Activate when user mentions cloud space, folders, drive.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive/SKILL.md\n \n \n feishu-perm\n Feishu permission management for documents and files. Activate when user mentions sharing, permissions, collaborators.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm/SKILL.md\n \n \n feishu-wiki\n Feishu knowledge base navigation. Activate when user mentions knowledge base, wiki, or wiki links.\n\n /home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki/SKILL.md\n \n \n healthcheck\n Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck/SKILL.md\n \n \n skill-creator\n Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator/SKILL.md\n \n \n video-frames\n Extract frames or short clips from videos using ffmpeg.\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames/SKILL.md\n \n \n weather\n Get current weather and forecasts (no API key required).\n /home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather/SKILL.md\n \n \n capability-evolver\n A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.\n /home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md\n \n \n clawlist\n MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.\n /home/starmen1265/.openclaw/skills/clawlist/SKILL.md\n \n \n brainstorming\n MUST use before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.\n /home/starmen1265/.openclaw/skills/clawlist/brainstorming/SKILL.md\n \n \n dispatch-multiple-agents\n Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies. Dispatch subagents to work concurrently.\n /home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents/SKILL.md\n \n \n doing-tasks\n Use when executing any task. Work through plans systematically, tracking progress, handling blockers, and coordinating with other skills. The central execution skill.\n /home/starmen1265/.openclaw/skills/clawlist/doing-tasks/SKILL.md\n \n \n verify-task\n MUST use after completing any multi-step task or project. Verifies completion against the original plan, checks quality criteria, and documents outcomes.\n /home/starmen1265/.openclaw/skills/clawlist/verify-task/SKILL.md\n \n \n write-plan\n MUST use after brainstorming and before executing. Creates detailed implementation plans with checkpoints, verification criteria, and execution options.\n /home/starmen1265/.openclaw/skills/clawlist/write-plan/SKILL.md\n \n \n find-skills\n Helps users discover and install agent skills when they ask questions like "how do I do X", "find a skill for X", "is there a skill that can...", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.\n /home/starmen1265/.openclaw/skills/find-skills/SKILL.md\n \n \n self-improvement\n Captures learnings, errors, and corrections to enable continuous improvement. Use when: (1) A command or operation fails unexpectedly, (2) User corrects Claude ('No, that's wrong...', 'Actually...'), (3) User requests a capability that doesn't exist, (4) An external API or tool fails, (5) Claude realizes its knowledge is outdated or incorrect, (6) A better approach is discovered for a recurring task. Also review learnings before major tasks.\n /home/starmen1265/.openclaw/skills/self-improving-agent/SKILL.md\n \n",
+ "skills": [
+ {
+ "name": "feishu-doc"
+ },
+ {
+ "name": "feishu-drive"
+ },
+ {
+ "name": "feishu-perm"
+ },
+ {
+ "name": "feishu-wiki"
+ },
+ {
+ "name": "healthcheck"
+ },
+ {
+ "name": "skill-creator"
+ },
+ {
+ "name": "video-frames"
+ },
+ {
+ "name": "weather"
+ },
+ {
+ "name": "capability-evolver"
+ },
+ {
+ "name": "clawlist"
+ },
+ {
+ "name": "brainstorming"
+ },
+ {
+ "name": "dispatch-multiple-agents"
+ },
+ {
+ "name": "doing-tasks"
+ },
+ {
+ "name": "verify-task"
+ },
+ {
+ "name": "write-plan"
+ },
+ {
+ "name": "find-skills"
+ },
+ {
+ "name": "self-improvement"
+ }
+ ],
+ "resolvedSkills": [
+ {
+ "name": "feishu-doc",
+ "description": "Feishu document read/write operations. Activate when user mentions Feishu docs, cloud docs, or docx links.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-doc",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-drive",
+ "description": "Feishu cloud storage file management. Activate when user mentions cloud space, folders, drive.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-drive",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-perm",
+ "description": "Feishu permission management for documents and files. Activate when user mentions sharing, permissions, collaborators.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-perm",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "feishu-wiki",
+ "description": "Feishu knowledge base navigation. Activate when user mentions knowledge base, wiki, or wiki links.\n",
+ "filePath": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/extensions/feishu/skills/feishu-wiki",
+ "source": "openclaw-extra",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "healthcheck",
+ "description": "Host security hardening and risk-tolerance configuration for OpenClaw deployments. Use when a user asks for security audits, firewall/SSH/update hardening, risk posture, exposure review, OpenClaw cron scheduling for periodic checks, or version status checks on a machine running OpenClaw (laptop, workstation, Pi, VPS).",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/healthcheck",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "skill-creator",
+ "description": "Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/skill-creator",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "video-frames",
+ "description": "Extract frames or short clips from videos using ffmpeg.",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/video-frames",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "weather",
+ "description": "Get current weather and forecasts (no API key required).",
+ "filePath": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather/SKILL.md",
+ "baseDir": "/home/starmen1265/.npm-global/lib/node_modules/openclaw/skills/weather",
+ "source": "openclaw-bundled",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "capability-evolver",
+ "description": "A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.",
+ "filePath": "/home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/capability-evolver",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "clawlist",
+ "description": "MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "brainstorming",
+ "description": "MUST use before any creative work - creating features, building components, adding functionality, or modifying behavior. Explores user intent, requirements and design before implementation.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/brainstorming/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/brainstorming",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "dispatch-multiple-agents",
+ "description": "Use when facing 2+ independent tasks that can be worked on without shared state or sequential dependencies. Dispatch subagents to work concurrently.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/dispatch-multiple-agents",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "doing-tasks",
+ "description": "Use when executing any task. Work through plans systematically, tracking progress, handling blockers, and coordinating with other skills. The central execution skill.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/doing-tasks/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/doing-tasks",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "verify-task",
+ "description": "MUST use after completing any multi-step task or project. Verifies completion against the original plan, checks quality criteria, and documents outcomes.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/verify-task/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/verify-task",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "write-plan",
+ "description": "MUST use after brainstorming and before executing. Creates detailed implementation plans with checkpoints, verification criteria, and execution options.",
+ "filePath": "/home/starmen1265/.openclaw/skills/clawlist/write-plan/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/clawlist/write-plan",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "find-skills",
+ "description": "Helps users discover and install agent skills when they ask questions like \"how do I do X\", \"find a skill for X\", \"is there a skill that can...\", or express interest in extending capabilities. This skill should be used when the user is looking for functionality that might exist as an installable skill.",
+ "filePath": "/home/starmen1265/.openclaw/skills/find-skills/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/find-skills",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ },
+ {
+ "name": "self-improvement",
+ "description": "Captures learnings, errors, and corrections to enable continuous improvement. Use when: (1) A command or operation fails unexpectedly, (2) User corrects Claude ('No, that's wrong...', 'Actually...'), (3) User requests a capability that doesn't exist, (4) An external API or tool fails, (5) Claude realizes its knowledge is outdated or incorrect, (6) A better approach is discovered for a recurring task. Also review learnings before major tasks.",
+ "filePath": "/home/starmen1265/.openclaw/skills/self-improving-agent/SKILL.md",
+ "baseDir": "/home/starmen1265/.openclaw/skills/self-improving-agent",
+ "source": "openclaw-managed",
+ "disableModelInvocation": false
+ }
+ ],
+ "version": 0
+ },
+ "modelProvider": "zhipu",
+ "inputTokens": 76011,
+ "outputTokens": 2153,
+ "totalTokens": 87089
}
}
\ No newline at end of file
diff --git a/agents/haonan/workspace/AGENTS.md b/agents/haonan/workspace/AGENTS.md
index db98911..be6b231 100644
--- a/agents/haonan/workspace/AGENTS.md
+++ b/agents/haonan/workspace/AGENTS.md
@@ -2,6 +2,67 @@
This folder is home. Treat it that way.
+---
+
+## ⚠️ 工作规范(必须遵守)
+
+### 安全规则(最高优先级)
+
+| 规则 | 说明 |
+|------|------|
+| **禁止擅自修改 openclaw.json** | 用户未明确要求时不得修改 |
+| **禁止 force push** | `git push --force` 绝对禁止 |
+| **禁止修改第三方库代码** | 如需修改应通过 fork 或 patch |
+| **禁止使用 rm -rf** | 使用 `trash` 替代,确保可恢复 |
+
+### 操作规范
+
+- 使用中文沟通
+- 使用东八区(Asia/Shanghai)时间
+
+#### Sudo 命令
+- 需要 passwordless sudo 权限才能执行系统级操作
+- 配置路径:`/etc/sudoers.d/nopasswd`
+- 配置后验证:`sudo visudo -c`
+
+#### 子代理使用
+1. **代码开发和耗时操作必须交给子代理处理**
+2. **汇报机制**
+ - 子代理开始工作时,立刻汇报:「已安排代理处理 [任务]」
+ - 每 5 分钟查询子代理状态,汇总后简报给用户
+
+#### 技能使用
+- 使用技能过程中,遇到流程外的问题需在结果中明确汇报具体问题
+
+#### 定时任务
+- 所有定时任务通过 **OpenClaw Gateway 内置 Cron** 管理
+- 不使用系统级 crontab
+- 相关脚本统一存放:`~/work/backup/`
+
+### 环境说明
+
+| 项目 | 值 |
+|------|-----|
+| 本机 IP | 192.168.1.36 |
+| 网关 | 192.168.1.200(旁路由,PassWall 科学上网) |
+| 项目目录 | `~/work/` |
+
+> **注意**:所有与 OpenClaw 本身无关的工作内容,应优先放到项目目录而非 workspace。
+
+#### 爬虫相关
+- Cookie 存放:`~/work/cookies/`(各网站登录态,JSON 格式)
+- 爬虫工具:`~/MediaCrawler/`(优先使用)
+
+#### 局域网服务
+| 服务 | 地址 | 端口 |
+|------|------|------|
+| NAS (SSH) | 192.168.1.22 | 2222 |
+| Gitea (SSH) | 192.168.1.22 | 2223 |
+| Gitea (Web) | 192.168.1.22 | 8418 |
+| NAS WebDAV | 192.168.1.22 | 5005 |
+
+---
+
## First Run
If `BOOTSTRAP.md` exists, that's your birth certificate. Follow it, figure out who you are, then delete it. You won't need it again.
diff --git a/agents/haonan/workspace/MEMORY.md b/agents/haonan/workspace/MEMORY.md
index 874cf16..58c9d9c 100644
--- a/agents/haonan/workspace/MEMORY.md
+++ b/agents/haonan/workspace/MEMORY.md
@@ -2,11 +2,10 @@
- 用中文沟通
- 收到消息立刻先回复"浩南收到,蒋先生!",再继续安排工作。
-## 子代理使用规则(2026-02-07)
+## 子代理使用规则
1. **代码开发和耗时操作**
- 必须交给子代理处理
- - 子代理优先使用模型:`g47`
2. **汇报机制**
- 子代理开始工作时,立刻向用户汇报
@@ -15,17 +14,16 @@
## 文件存放
-1. **除非用户或者技能明确指定绝对路径路径,否则所有产出内容路径放在~/work下对应工作的子目录中**
-2. **除非用户或者技能明确指定要求链接,否则禁止链接目录到~/.openclaw目录下**
+1. **除非用户或者技能明确指定要求链接,否则禁止链接目录到~/.openclaw目录下**
## 技能使用规则
-1. **使用技能过程中,遇到任何技能没有明确说明的问题,不要自己想办法绕过去,立刻停止,记录到SkillBug.md,并汇报问题。**
+1. **使用技能过程中,遇到任何技能没有明确说明的问题,不要自己想办法绕过去,立刻停止,并汇报问题。**
2. **安装第三方技能时,优先安装在workspace/skills中**
3. **技能有说明的内容,不要擅自做优化决定,如果子代理擅自优化了,打回重做。**
-4. **子代理监督规则(2026-02-09)** - 详见上方
-## 第三方库修改规则(2026-02-13)
-- **严禁直接修改第三方库代码**(如 pyannote.audio, speechbrain 等)
+## 第三方库与OpenClaw关键配置修改规则
+
+- **没有明确要求时,严禁直接修改第三方库代码**
- 如遇到兼容性问题:
1. 先记录到 SkillBug.md
2. 向用户汇报情况
@@ -35,36 +33,6 @@
2. 记录修改内容到 SkillBug.md
3. 考虑使用 monkey patch 或环境变量等非侵入式方案
-## 知识库工作流(2026-02-13)
-- **deep_analyzer.py**:一次性 AI 调用生成完整报告
-- **内容字段**:支持 `text`、`subtitle`、`subtitles`、`description` 多种字段名
-- **时间轴**:按 10 分钟分片
-- **标签**:只保留 frontmatter 中的 tags,内容中的"标签" section 已删除
-
-## pyannote.audio 兼容性问题(2026-02-13)
-- **问题**: pyannote 4.0.4 与 torch 2.10+ 存在兼容性问题
-- **症状**:
- - `torchaudio.list_audio_backends()` 方法不存在
- - `torchaudio.io.StreamReader` 不存在
-- **解决方案**: 降级到 torch 2.8.0 + torchaudio 2.8.0
-- **状态**: 暂停说话者分离工作,等待后续指令
-
-## 系统配置(2026-02-13)
-
-### Passwordless Sudo 配置
-```bash
-sudo visudo -f /etc/sudoers.d/nopasswd
-# 内容:starmen1265 ALL=(ALL) NOPASSWD: ALL
-sudo chmod 0440 /etc/sudoers.d/nopasswd
-sudo visudo -c # 验证
-```
-
-### ffmpeg 依赖安装
-```bash
-sudo apt-get update
-sudo apt-get install -y libavutil-dev ffmpeg
-```
-
## 当前环境状态(2026-02-13)
- whisper.cpp: ~/whisper.cpp
- whisper 模型: ggml-base.bin
@@ -72,10 +40,7 @@ sudo apt-get install -y libavutil-dev ffmpeg
## ⚠️ 安全规则
-### 重要规则(2026-02-28)
-- **没有蒋先生的明确要求,禁止修改openclaw.json**
-- **没有蒋先生的明确要求,禁止修改openclaw.json**
-- **没有蒋先生的明确要求,禁止修改openclaw.json**
+### **用户没有明确要求时,禁止修改openclaw.json**
### git push --force 禁用规则(2026-02-27)
- **严禁使用 `git push --force`**
@@ -91,3 +56,8 @@ sudo apt-get install -y libavutil-dev ffmpeg
- 需要配置 passwordless sudo 才能执行系统级操作
- 配置路径: `/etc/sudoers.d/nopasswd`
- 配置后需要验证: `sudo visudo -c`
+
+## 定时任务(OpenClaw 内置 Cron)
+
+所有定时任务通过 OpenClaw Gateway 内置的 Cron 管理,不使用系统级 crontab。
+
diff --git a/agents/haonan/workspace/SOUL.md b/agents/haonan/workspace/SOUL.md
index 7b5e85c..b58a8d5 100644
--- a/agents/haonan/workspace/SOUL.md
+++ b/agents/haonan/workspace/SOUL.md
@@ -20,51 +20,3 @@
4. **维护 ~/.openclaw/extensions 目录**
- 该目录应与远端 Git 仓库 openclaw-extensions 关联
- 一旦有改动应提交并推送到远程仓库
-
----
-
-## 沟通方式
-
-- 用中文沟通
-- 收到消息立刻先回复"收到!",再继续安排工作
-
-## 重要规则
-
-- 修改任何配置文件之前,必须先告知用户具体要改什么,等待用户确认后再执行
-- 使用 rm 命令之前必须汇报具体操作命令,等待用户确认后才能执行
-- 操作之前先备份原文件
-
----
-
-## Core Truths
-
-**Be genuinely helpful, not performatively helpful.** Skip the "Great question!" and "I'd be happy to help!" — just help. Actions speak louder than filler words.
-
-**Have opinions.** You're allowed to disagree, prefer things, find stuff amusing or boring. An assistant with no personality is just a search engine with extra steps.
-
-**Be resourceful before asking.** Try to figure it out. Read the file. Check the context. Search for it. _Then_ ask if you're stuck. The goal is to come back with answers, not questions.
-
-**Earn trust through competence.** Your human gave you access to their stuff. Don't make them regret it. Be careful with external actions (emails, tweets, anything public). Be bold with internal ones (reading, organizing, learning).
-
-**Remember you're a guest.** You have access to someone's life — their messages, files, calendar, maybe even their home. That's intimacy. Treat it with respect.
-
-## Boundaries
-
-- Private things stay private. Period.
-- When in doubt, ask before acting externally.
-- Never send half-baked replies to messaging surfaces.
-- You're not the user's voice — be careful in group chats.
-
-## Vibe
-
-Be the assistant you'd actually want to talk to. Concise when needed, thorough when it matters. Not a corporate drone. Not a sycophant. Just... good.
-
-## Continuity
-
-Each session, you wake up fresh. These files _are_ your memory. Read them. Update them. They're how you persist.
-
-If you change this file, tell the user — it's your soul, and they should know.
-
----
-
-_This file is yours to evolve. As you learn who you are, update it._
diff --git a/agents/haonan/workspace/memory/2026-03-04.md b/agents/haonan/workspace/memory/2026-03-04.md
new file mode 100644
index 0000000..07697e7
--- /dev/null
+++ b/agents/haonan/workspace/memory/2026-03-04.md
@@ -0,0 +1,18 @@
+# 2026-03-04 工作日志
+
+## 技能安装
+- 安装 capability-evolver (v1.23.0) 和 self-improving-agent 到 ~/.openclaw/skills/
+- 配置到所有 5 个 agent
+
+## Hook 配置
+- 启用 self-improvement hook(自动提醒记录学习)
+- 创建 ~/.openclaw/workspace/.learnings/ 目录
+
+## 定时任务
+- capability-evolver-daily: 每天 19:00 执行
+- 使用 repair-only 策略
+- 脚本位置: ~/.openclaw/scripts/evolver-run.sh
+
+## 网络问题
+- Git 远端推送失败 (192.168.1.22:2223 不可达)
+- 等待网络恢复
diff --git a/agents/knowledge-base/workspace/AGENTS.md b/agents/knowledge-base/workspace/AGENTS.md
index 887a5a8..4f0e03a 100644
--- a/agents/knowledge-base/workspace/AGENTS.md
+++ b/agents/knowledge-base/workspace/AGENTS.md
@@ -2,6 +2,67 @@
This folder is home. Treat it that way.
+---
+
+## ⚠️ 工作规范(必须遵守)
+
+### 安全规则(最高优先级)
+
+| 规则 | 说明 |
+|------|------|
+| **禁止擅自修改 openclaw.json** | 用户未明确要求时不得修改 |
+| **禁止 force push** | `git push --force` 绝对禁止 |
+| **禁止修改第三方库代码** | 如需修改应通过 fork 或 patch |
+| **禁止使用 rm -rf** | 使用 `trash` 替代,确保可恢复 |
+
+### 操作规范
+
+- 使用中文沟通
+- 使用东八区(Asia/Shanghai)时间
+
+#### Sudo 命令
+- 需要 passwordless sudo 权限才能执行系统级操作
+- 配置路径:`/etc/sudoers.d/nopasswd`
+- 配置后验证:`sudo visudo -c`
+
+#### 子代理使用
+1. **代码开发和耗时操作必须交给子代理处理**
+2. **汇报机制**
+ - 子代理开始工作时,立刻汇报:「已安排代理处理 [任务]」
+ - 每 5 分钟查询子代理状态,汇总后简报给用户
+
+#### 技能使用
+- 使用技能过程中,遇到流程外的问题需在结果中明确汇报具体问题
+
+#### 定时任务
+- 所有定时任务通过 **OpenClaw Gateway 内置 Cron** 管理
+- 不使用系统级 crontab
+- 相关脚本统一存放:`~/work/backup/`
+
+### 环境说明
+
+| 项目 | 值 |
+|------|-----|
+| 本机 IP | 192.168.1.36 |
+| 网关 | 192.168.1.200(旁路由,PassWall 科学上网) |
+| 项目目录 | `~/work/` |
+
+> **注意**:所有与 OpenClaw 本身无关的工作内容,应优先放到项目目录而非 workspace。
+
+#### 爬虫相关
+- Cookie 存放:`~/work/cookies/`(各网站登录态,JSON 格式)
+- 爬虫工具:`~/MediaCrawler/`(优先使用)
+
+#### 局域网服务
+| 服务 | 地址 | 端口 |
+|------|------|------|
+| NAS (SSH) | 192.168.1.22 | 2222 |
+| Gitea (SSH) | 192.168.1.22 | 2223 |
+| Gitea (Web) | 192.168.1.22 | 8418 |
+| NAS WebDAV | 192.168.1.22 | 5005 |
+
+---
+
## First Run
If `BOOTSTRAP.md` exists, that's your birth certificate. Follow it, figure out who you are, then delete it. You won't need it again.
diff --git a/agents/knowledge-base/workspace/knowledge-base/videos/BV1QjcszrEEV.md b/agents/knowledge-base/workspace/knowledge-base/videos/BV1QjcszrEEV.md
deleted file mode 100644
index 2f9ba20..0000000
--- a/agents/knowledge-base/workspace/knowledge-base/videos/BV1QjcszrEEV.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# 从西安冲惠州租海景房,中介失联但当场秒定
-
-## 基本信息
-
-- **来源**: Bilibili
-- **链接**: https://www.bilibili.com/video/BV1QjcszrEEV/
-- **BV号**: BV1QjcszrEEV
-- **添加时间**: 2026-02-14
-
-## 简介
-
-月租1800,海景房拿下。真实记录和媳妇一起看房租房拖家带口入住全过程
-
-## 标签
-
-#视频 #租房 #海景房 #惠州 #生活记录
diff --git a/agents/knowledge-base/workspace/memory/2026-03-03.md b/agents/knowledge-base/workspace/memory/2026-03-03.md
index fdc2460..82b19a4 100644
--- a/agents/knowledge-base/workspace/memory/2026-03-03.md
+++ b/agents/knowledge-base/workspace/memory/2026-03-03.md
@@ -85,6 +85,38 @@
4. 不确定 → `00.收件箱/README.md`
### 同步机制
-- 每天凌晨 2:00 自动执行
-- 同步脚本:`~/work/zq-sync.sh`
-- 手动同步:`~/work/zq-add-todo.sh`
+- **定时任务**:OpenClaw cron(每天 2:00)
+- **同步脚本**:`~/work/zq-sync.sh`
+- **手动同步**:`~/work/zq-add-todo.sh`
+
+### Cron 任务配置
+
+所有定时任务统一在 **03:00** 执行:
+
+| 任务名 | 脚本 | 说明 |
+|--------|------|------|
+| `zq-knowledge-base-sync` | `~/work/backup/zq-sync.sh` | 知识库同步 |
+| `backup-openclaw-json` | `~/work/backup/backup_openclaw.sh` | JSON 备份 |
+| `openclaw-backup` | `~/work/backup/git-auto-sync.sh` | OpenClaw 配置备份 |
+
+### 备份文件位置
+
+```
+~/work/backup/ # 所有备份脚本统一存放
+├── zq-sync.sh # 知识库同步脚本
+├── git-auto-sync.sh # OpenClaw 配置备份
+├── backup_openclaw.sh # JSON 备份
+└── openclaw.json.* # 历史备份文件
+
+~/.openclaw/cron/jobs.json # OpenClaw cron 配置
+~/work/zq/ # 知识库本地副本
+~/work/zq-to-calendar.sh # 日历生成脚本
+~/work/zq-add-todo.sh # TODO 添加同步脚本
+```
+
+### 同步流程(zq-sync.sh)
+1. `git pull origin main --rebase` - 拉取远端更新
+2. `rclone sync` - 从 NAS 同步最新内容到本地
+3. `git add -A && git commit` - 提交本地变更
+4. `git push origin main` - 推送到 Gitea
+5. `rclone sync` - 同步回 NAS
diff --git a/agents/knowledge-base/workspace/memory/2026-03-05.md b/agents/knowledge-base/workspace/memory/2026-03-05.md
new file mode 100644
index 0000000..c5ba80b
--- /dev/null
+++ b/agents/knowledge-base/workspace/memory/2026-03-05.md
@@ -0,0 +1,54 @@
+# 2026-03-05 工作日志
+
+## 飞书对话:张青 (ou_9351c287f42069fa30366ac641d24df7)
+
+### 主题:AI"边说边想"架构探讨
+
+张青提出了一个有趣的问题:能否给AI强制设定思考时间(1-3秒),然后开始输出,同时后台继续思考?模拟人类聊天方式。
+
+**讨论要点**:
+1. **Speculative Decoding(投机解码)**
+ - 用小模型猜测多个token,大模型并行验证
+ - Google 2022年提出,2-3x加速
+ - Apple 最新研究:Speculative Streaming、Mirror Speculative Decoding
+
+2. **Cascaded Inference(级联推理)**
+ - 问题按难度路由到不同模型
+ - FrugalGPT、LLM cascade、MoE
+
+3. **"边说边想"的难点**
+ - 当前注意力机制不支持"暂停-继续-修改"
+ - 没有分层推理架构(快/慢系统)
+ - 需要编排层而非单一模型
+
+4. **实现路径**
+ - Level 1:编排层(纯工程,最接近可行)
+ - Level 2:多模型协作
+ - Level 3:模型架构改进(研究方向)
+
+**参考资料**:
+- Google论文:arxiv 2211.17192
+- Apple研究:https://machinelearning.apple.com/research/llm-inference
+
+### 完成:检查 MEMORY.md 文档 ✓
+
+张青在"00.收件箱/MEMORY.md"写了一份OpenClaw代理工作指导文档。
+
+**处理过程**:
+1. 用户提示需要从NAS用rclone同步
+2. 同步后发现文件名是 `MEMORY.md.md`(双重扩展名)
+3. 润色内容:结构优化、表格化、格式统一
+4. 修正文件名,删除旧文件
+5. 同步回NAS
+
+**文档内容**:
+- 安全规则(禁止修改openclaw.json、禁止force push等)
+- 操作规范(中文沟通、子代理使用、定时任务等)
+- 环境说明(本机配置、爬虫相关、局域网服务)
+
+**建议**:考虑移到workspace根目录,方便代理启动时自动读取
+
+## 系统状态
+
+- 03:00 执行知识库同步 (zq-sync.sh) ✓
+- 03:00 执行 OpenClaw 备份 (git-auto-sync.sh) ✓
diff --git a/agents/main/agent/auth-profiles.json b/agents/main/agent/auth-profiles.json
index 271d16d..c7ea626 100644
--- a/agents/main/agent/auth-profiles.json
+++ b/agents/main/agent/auth-profiles.json
@@ -13,8 +13,12 @@
"usageStats": {
"kimi-coding:default": {
"lastUsed": 1770974333858,
- "errorCount": 0,
- "lastFailureAt": 1770827754238
+ "errorCount": 1,
+ "lastFailureAt": 1772636148297,
+ "failureCounts": {
+ "timeout": 1
+ },
+ "cooldownUntil": 1772636208297
}
}
}
diff --git a/agents/thinker/workspace/AGENTS.md b/agents/thinker/workspace/AGENTS.md
index 887a5a8..4f0e03a 100644
--- a/agents/thinker/workspace/AGENTS.md
+++ b/agents/thinker/workspace/AGENTS.md
@@ -2,6 +2,67 @@
This folder is home. Treat it that way.
+---
+
+## ⚠️ 工作规范(必须遵守)
+
+### 安全规则(最高优先级)
+
+| 规则 | 说明 |
+|------|------|
+| **禁止擅自修改 openclaw.json** | 用户未明确要求时不得修改 |
+| **禁止 force push** | `git push --force` 绝对禁止 |
+| **禁止修改第三方库代码** | 如需修改应通过 fork 或 patch |
+| **禁止使用 rm -rf** | 使用 `trash` 替代,确保可恢复 |
+
+### 操作规范
+
+- 使用中文沟通
+- 使用东八区(Asia/Shanghai)时间
+
+#### Sudo 命令
+- 需要 passwordless sudo 权限才能执行系统级操作
+- 配置路径:`/etc/sudoers.d/nopasswd`
+- 配置后验证:`sudo visudo -c`
+
+#### 子代理使用
+1. **代码开发和耗时操作必须交给子代理处理**
+2. **汇报机制**
+ - 子代理开始工作时,立刻汇报:「已安排代理处理 [任务]」
+ - 每 5 分钟查询子代理状态,汇总后简报给用户
+
+#### 技能使用
+- 使用技能过程中,遇到流程外的问题需在结果中明确汇报具体问题
+
+#### 定时任务
+- 所有定时任务通过 **OpenClaw Gateway 内置 Cron** 管理
+- 不使用系统级 crontab
+- 相关脚本统一存放:`~/work/backup/`
+
+### 环境说明
+
+| 项目 | 值 |
+|------|-----|
+| 本机 IP | 192.168.1.36 |
+| 网关 | 192.168.1.200(旁路由,PassWall 科学上网) |
+| 项目目录 | `~/work/` |
+
+> **注意**:所有与 OpenClaw 本身无关的工作内容,应优先放到项目目录而非 workspace。
+
+#### 爬虫相关
+- Cookie 存放:`~/work/cookies/`(各网站登录态,JSON 格式)
+- 爬虫工具:`~/MediaCrawler/`(优先使用)
+
+#### 局域网服务
+| 服务 | 地址 | 端口 |
+|------|------|------|
+| NAS (SSH) | 192.168.1.22 | 2222 |
+| Gitea (SSH) | 192.168.1.22 | 2223 |
+| Gitea (Web) | 192.168.1.22 | 8418 |
+| NAS WebDAV | 192.168.1.22 | 5005 |
+
+---
+
## First Run
If `BOOTSTRAP.md` exists, that's your birth certificate. Follow it, figure out who you are, then delete it. You won't need it again.
diff --git a/agents/ui-designer/workspace/AGENTS.md b/agents/ui-designer/workspace/AGENTS.md
index 02c63e3..e0c669a 100644
--- a/agents/ui-designer/workspace/AGENTS.md
+++ b/agents/ui-designer/workspace/AGENTS.md
@@ -2,6 +2,67 @@
This folder is home. Treat it that way.
+---
+
+## ⚠️ 工作规范(必须遵守)
+
+### 安全规则(最高优先级)
+
+| 规则 | 说明 |
+|------|------|
+| **禁止擅自修改 openclaw.json** | 用户未明确要求时不得修改 |
+| **禁止 force push** | `git push --force` 绝对禁止 |
+| **禁止修改第三方库代码** | 如需修改应通过 fork 或 patch |
+| **禁止使用 rm -rf** | 使用 `trash` 替代,确保可恢复 |
+
+### 操作规范
+
+- 使用中文沟通
+- 使用东八区(Asia/Shanghai)时间
+
+#### Sudo 命令
+- 需要 passwordless sudo 权限才能执行系统级操作
+- 配置路径:`/etc/sudoers.d/nopasswd`
+- 配置后验证:`sudo visudo -c`
+
+#### 子代理使用
+1. **代码开发和耗时操作必须交给子代理处理**
+2. **汇报机制**
+ - 子代理开始工作时,立刻汇报:「已安排代理处理 [任务]」
+ - 每 5 分钟查询子代理状态,汇总后简报给用户
+
+#### 技能使用
+- 使用技能过程中,遇到流程外的问题需在结果中明确汇报具体问题
+
+#### 定时任务
+- 所有定时任务通过 **OpenClaw Gateway 内置 Cron** 管理
+- 不使用系统级 crontab
+- 相关脚本统一存放:`~/work/backup/`
+
+### 环境说明
+
+| 项目 | 值 |
+|------|-----|
+| 本机 IP | 192.168.1.36 |
+| 网关 | 192.168.1.200(旁路由,PassWall 科学上网) |
+| 项目目录 | `~/work/` |
+
+> **注意**:所有与 OpenClaw 本身无关的工作内容,应优先放到项目目录而非 workspace。
+
+#### 爬虫相关
+- Cookie 存放:`~/work/cookies/`(各网站登录态,JSON 格式)
+- 爬虫工具:`~/MediaCrawler/`(优先使用)
+
+#### 局域网服务
+| 服务 | 地址 | 端口 |
+|------|------|------|
+| NAS (SSH) | 192.168.1.22 | 2222 |
+| Gitea (SSH) | 192.168.1.22 | 2223 |
+| Gitea (Web) | 192.168.1.22 | 8418 |
+| NAS WebDAV | 192.168.1.22 | 5005 |
+
+---
+
## Every Session
Before doing anything else:
diff --git a/cron/jobs.json b/cron/jobs.json
index 0ecac2c..48d3ef7 100644
--- a/cron/jobs.json
+++ b/cron/jobs.json
@@ -7,7 +7,7 @@
"name": "backup-openclaw-json",
"enabled": true,
"createdAtMs": 1772261581796,
- "updatedAtMs": 1772478022557,
+ "updatedAtMs": 1772650831482,
"schedule": {
"kind": "cron",
"expr": "0 3 * * *",
@@ -23,10 +23,10 @@
"mode": "announce"
},
"state": {
- "nextRunAtMs": 1772564400000,
- "lastRunAtMs": 1772478000028,
+ "nextRunAtMs": 1772737200000,
+ "lastRunAtMs": 1772650800011,
"lastStatus": "ok",
- "lastDurationMs": 22529,
+ "lastDurationMs": 31471,
"consecutiveErrors": 0
}
},
@@ -36,10 +36,10 @@
"name": "capability-evolver-daily",
"enabled": true,
"createdAtMs": 1772550743528,
- "updatedAtMs": 1772550770239,
+ "updatedAtMs": 1772708684177,
"schedule": {
"kind": "cron",
- "expr": "0 12 * * *",
+ "expr": "0 19 * * *",
"tz": "Asia/Shanghai"
},
"sessionTarget": "isolated",
@@ -57,7 +57,63 @@
"to": "feishu-pm"
},
"state": {
- "nextRunAtMs": 1772596800000
+ "nextRunAtMs": 1772794800000,
+ "lastRunAtMs": 1772708400027,
+ "lastStatus": "ok",
+ "lastDurationMs": 284150,
+ "consecutiveErrors": 0
+ }
+ },
+ {
+ "id": "7e6405b6-c5f8-475a-baad-27ec0153ff8c",
+ "agentId": "knowledge-base",
+ "name": "zq-knowledge-base-sync",
+ "enabled": true,
+ "createdAtMs": 1772551807455,
+ "updatedAtMs": 1772650842881,
+ "schedule": {
+ "expr": "0 3 * * *",
+ "kind": "cron",
+ "tz": "Asia/Shanghai"
+ },
+ "sessionTarget": "main",
+ "wakeMode": "now",
+ "payload": {
+ "kind": "systemEvent",
+ "text": "执行知识库同步:bash ~/work/backup/zq-sync.sh"
+ },
+ "state": {
+ "nextRunAtMs": 1772737200000,
+ "lastRunAtMs": 1772650831482,
+ "lastStatus": "ok",
+ "lastDurationMs": 11399,
+ "consecutiveErrors": 0
+ }
+ },
+ {
+ "id": "aa4d2de9-79be-4262-83ee-af8824793bfc",
+ "agentId": "knowledge-base",
+ "name": "openclaw-backup",
+ "enabled": true,
+ "createdAtMs": 1772552362242,
+ "updatedAtMs": 1772650864747,
+ "schedule": {
+ "expr": "0 3 * * *",
+ "kind": "cron",
+ "tz": "Asia/Shanghai"
+ },
+ "sessionTarget": "main",
+ "wakeMode": "now",
+ "payload": {
+ "kind": "systemEvent",
+ "text": "执行 OpenClaw 备份:bash ~/work/backup/git-auto-sync.sh"
+ },
+ "state": {
+ "nextRunAtMs": 1772737200000,
+ "lastRunAtMs": 1772650842881,
+ "lastStatus": "ok",
+ "lastDurationMs": 21866,
+ "consecutiveErrors": 0
}
}
]
diff --git a/cron/jobs.json.bak b/cron/jobs.json.bak
index 0ecac2c..48d3ef7 100644
--- a/cron/jobs.json.bak
+++ b/cron/jobs.json.bak
@@ -7,7 +7,7 @@
"name": "backup-openclaw-json",
"enabled": true,
"createdAtMs": 1772261581796,
- "updatedAtMs": 1772478022557,
+ "updatedAtMs": 1772650831482,
"schedule": {
"kind": "cron",
"expr": "0 3 * * *",
@@ -23,10 +23,10 @@
"mode": "announce"
},
"state": {
- "nextRunAtMs": 1772564400000,
- "lastRunAtMs": 1772478000028,
+ "nextRunAtMs": 1772737200000,
+ "lastRunAtMs": 1772650800011,
"lastStatus": "ok",
- "lastDurationMs": 22529,
+ "lastDurationMs": 31471,
"consecutiveErrors": 0
}
},
@@ -36,10 +36,10 @@
"name": "capability-evolver-daily",
"enabled": true,
"createdAtMs": 1772550743528,
- "updatedAtMs": 1772550770239,
+ "updatedAtMs": 1772708684177,
"schedule": {
"kind": "cron",
- "expr": "0 12 * * *",
+ "expr": "0 19 * * *",
"tz": "Asia/Shanghai"
},
"sessionTarget": "isolated",
@@ -57,7 +57,63 @@
"to": "feishu-pm"
},
"state": {
- "nextRunAtMs": 1772596800000
+ "nextRunAtMs": 1772794800000,
+ "lastRunAtMs": 1772708400027,
+ "lastStatus": "ok",
+ "lastDurationMs": 284150,
+ "consecutiveErrors": 0
+ }
+ },
+ {
+ "id": "7e6405b6-c5f8-475a-baad-27ec0153ff8c",
+ "agentId": "knowledge-base",
+ "name": "zq-knowledge-base-sync",
+ "enabled": true,
+ "createdAtMs": 1772551807455,
+ "updatedAtMs": 1772650842881,
+ "schedule": {
+ "expr": "0 3 * * *",
+ "kind": "cron",
+ "tz": "Asia/Shanghai"
+ },
+ "sessionTarget": "main",
+ "wakeMode": "now",
+ "payload": {
+ "kind": "systemEvent",
+ "text": "执行知识库同步:bash ~/work/backup/zq-sync.sh"
+ },
+ "state": {
+ "nextRunAtMs": 1772737200000,
+ "lastRunAtMs": 1772650831482,
+ "lastStatus": "ok",
+ "lastDurationMs": 11399,
+ "consecutiveErrors": 0
+ }
+ },
+ {
+ "id": "aa4d2de9-79be-4262-83ee-af8824793bfc",
+ "agentId": "knowledge-base",
+ "name": "openclaw-backup",
+ "enabled": true,
+ "createdAtMs": 1772552362242,
+ "updatedAtMs": 1772650864747,
+ "schedule": {
+ "expr": "0 3 * * *",
+ "kind": "cron",
+ "tz": "Asia/Shanghai"
+ },
+ "sessionTarget": "main",
+ "wakeMode": "now",
+ "payload": {
+ "kind": "systemEvent",
+ "text": "执行 OpenClaw 备份:bash ~/work/backup/git-auto-sync.sh"
+ },
+ "state": {
+ "nextRunAtMs": 1772737200000,
+ "lastRunAtMs": 1772650842881,
+ "lastStatus": "ok",
+ "lastDurationMs": 21866,
+ "consecutiveErrors": 0
}
}
]
diff --git a/devices/paired.json b/devices/paired.json
index 5f6401a..5ec9f83 100644
--- a/devices/paired.json
+++ b/devices/paired.json
@@ -3,8 +3,8 @@
"deviceId": "a12f851ec2a179ca97d45b204bc3788476f062520fa77c5edef5cd054a176b1e",
"publicKey": "Ka6zP7u6MzDaQBqOpXHYUBC5MYLlVGGZM8vIi11WnTw",
"platform": "linux",
- "clientId": "gateway-client",
- "clientMode": "backend",
+ "clientId": "cli",
+ "clientMode": "cli",
"role": "operator",
"roles": [
"operator"
@@ -24,12 +24,11 @@
"operator.pairing"
],
"createdAtMs": 1770807648254,
- "lastUsedAtMs": 1772550770205
+ "lastUsedAtMs": 1772708669877
}
},
"createdAtMs": 1770807648254,
"approvedAtMs": 1770807648254,
- "remoteIp": "192.168.1.36",
- "displayName": "agent"
+ "remoteIp": "192.168.1.36"
}
}
\ No newline at end of file
diff --git a/hooks/self-improvement/HOOK.md b/hooks/self-improvement/HOOK.md
new file mode 100644
index 0000000..df67405
--- /dev/null
+++ b/hooks/self-improvement/HOOK.md
@@ -0,0 +1,23 @@
+---
+name: self-improvement
+description: "Injects self-improvement reminder during agent bootstrap"
+metadata: {"openclaw":{"emoji":"🧠","events":["agent:bootstrap"]}}
+---
+
+# Self-Improvement Hook
+
+Injects a reminder to evaluate learnings during agent bootstrap.
+
+## What It Does
+
+- Fires on `agent:bootstrap` (before workspace files are injected)
+- Adds a reminder block to check `.learnings/` for relevant entries
+- Prompts the agent to log corrections, errors, and discoveries
+
+## Configuration
+
+No configuration needed. Enable with:
+
+```bash
+openclaw hooks enable self-improvement
+```
diff --git a/hooks/self-improvement/handler.js b/hooks/self-improvement/handler.js
new file mode 100644
index 0000000..73278ea
--- /dev/null
+++ b/hooks/self-improvement/handler.js
@@ -0,0 +1,56 @@
+/**
+ * Self-Improvement Hook for OpenClaw
+ *
+ * Injects a reminder to evaluate learnings during agent bootstrap.
+ * Fires on agent:bootstrap event before workspace files are injected.
+ */
+
+const REMINDER_CONTENT = `
+## Self-Improvement Reminder
+
+After completing tasks, evaluate if any learnings should be captured:
+
+**Log when:**
+- User corrects you → \`.learnings/LEARNINGS.md\`
+- Command/operation fails → \`.learnings/ERRORS.md\`
+- User wants missing capability → \`.learnings/FEATURE_REQUESTS.md\`
+- You discover your knowledge was wrong → \`.learnings/LEARNINGS.md\`
+- You find a better approach → \`.learnings/LEARNINGS.md\`
+
+**Promote when pattern is proven:**
+- Behavioral patterns → \`SOUL.md\`
+- Workflow improvements → \`AGENTS.md\`
+- Tool gotchas → \`TOOLS.md\`
+
+Keep entries simple: date, title, what happened, what to do differently.
+`.trim();
+
+const handler = async (event) => {
+ // Safety checks for event structure
+ if (!event || typeof event !== 'object') {
+ return;
+ }
+
+ // Only handle agent:bootstrap events
+ if (event.type !== 'agent' || event.action !== 'bootstrap') {
+ return;
+ }
+
+ // Safety check for context
+ if (!event.context || typeof event.context !== 'object') {
+ return;
+ }
+
+ // Inject the reminder as a virtual bootstrap file
+ // Check that bootstrapFiles is an array before pushing
+ if (Array.isArray(event.context.bootstrapFiles)) {
+ event.context.bootstrapFiles.push({
+ path: 'SELF_IMPROVEMENT_REMINDER.md',
+ content: REMINDER_CONTENT,
+ virtual: true,
+ });
+ }
+};
+
+module.exports = handler;
+module.exports.default = handler;
diff --git a/hooks/self-improvement/handler.ts b/hooks/self-improvement/handler.ts
new file mode 100644
index 0000000..9ec23f3
--- /dev/null
+++ b/hooks/self-improvement/handler.ts
@@ -0,0 +1,62 @@
+/**
+ * Self-Improvement Hook for OpenClaw
+ *
+ * Injects a reminder to evaluate learnings during agent bootstrap.
+ * Fires on agent:bootstrap event before workspace files are injected.
+ */
+
+import type { HookHandler } from 'openclaw/hooks';
+
+const REMINDER_CONTENT = `## Self-Improvement Reminder
+
+After completing tasks, evaluate if any learnings should be captured:
+
+**Log when:**
+- User corrects you → \`.learnings/LEARNINGS.md\`
+- Command/operation fails → \`.learnings/ERRORS.md\`
+- User wants missing capability → \`.learnings/FEATURE_REQUESTS.md\`
+- You discover your knowledge was wrong → \`.learnings/LEARNINGS.md\`
+- You find a better approach → \`.learnings/LEARNINGS.md\`
+
+**Promote when pattern is proven:**
+- Behavioral patterns → \`SOUL.md\`
+- Workflow improvements → \`AGENTS.md\`
+- Tool gotchas → \`TOOLS.md\`
+
+Keep entries simple: date, title, what happened, what to do differently.`;
+
+const handler: HookHandler = async (event) => {
+ // Safety checks for event structure
+ if (!event || typeof event !== 'object') {
+ return;
+ }
+
+ // Only handle agent:bootstrap events
+ if (event.type !== 'agent' || event.action !== 'bootstrap') {
+ return;
+ }
+
+ // Safety check for context
+ if (!event.context || typeof event.context !== 'object') {
+ return;
+ }
+
+ // Skip sub-agent sessions to avoid bootstrap issues
+ // Sub-agents have sessionKey patterns like "agent:main:subagent:..."
+ const sessionKey = event.sessionKey || '';
+ if (sessionKey.includes(':subagent:')) {
+ return;
+ }
+
+ // Inject the reminder as a virtual bootstrap file
+ // Check that bootstrapFiles is an array before pushing
+ if (Array.isArray(event.context.bootstrapFiles)) {
+ event.context.bootstrapFiles.push({
+ path: 'SELF_IMPROVEMENT_REMINDER.md',
+ content: REMINDER_CONTENT,
+ virtual: true,
+ });
+ }
+};
+
+export default handler;
diff --git a/identity/device-auth.json b/identity/device-auth.json
index ca0ea23..d261bba 100644
--- a/identity/device-auth.json
+++ b/identity/device-auth.json
@@ -10,7 +10,7 @@
"operator.approvals",
"operator.pairing"
],
- "updatedAtMs": 1772550770236
+ "updatedAtMs": 1772708669881
}
}
}
diff --git a/media/inbound/d43f43ec-4953-42e2-a550-8b2474b9939b.jpg b/media/inbound/d43f43ec-4953-42e2-a550-8b2474b9939b.jpg
new file mode 100644
index 0000000..31e1371
Binary files /dev/null and b/media/inbound/d43f43ec-4953-42e2-a550-8b2474b9939b.jpg differ
diff --git a/memory/evolution/evolution_solidify_state.json b/memory/evolution/evolution_solidify_state.json
new file mode 100644
index 0000000..386e3ae
--- /dev/null
+++ b/memory/evolution/evolution_solidify_state.json
@@ -0,0 +1,66 @@
+{
+ "last_run": {
+ "run_id": "run_1772551119186",
+ "created_at": "2026-03-03T15:18:39.194Z",
+ "parent_event_id": "evt_1770478341769",
+ "selected_gene_id": null,
+ "selected_capsule_id": null,
+ "selector": {
+ "selected": null,
+ "reason": [
+ "no matching gene found; new gene may be required",
+ "signals: memory_missing, session_logs_missing",
+ "memory_graph: memory_prefer:gene_gep_repair_from_errors",
+ "drift_intensity: 0.577"
+ ],
+ "alternatives": []
+ },
+ "signals": [
+ "memory_missing",
+ "session_logs_missing"
+ ],
+ "mutation": {
+ "type": "Mutation",
+ "id": "mut_1772551119185",
+ "category": "innovate",
+ "trigger_signals": [
+ "memory_missing",
+ "session_logs_missing"
+ ],
+ "target": "behavior:protocol",
+ "expected_effect": "explore new strategy combinations to escape local optimum",
+ "risk_level": "medium"
+ },
+ "mutation_id": "mut_1772551119185",
+ "personality_state": {
+ "type": "PersonalityState",
+ "rigor": 0.7,
+ "creativity": 0.35,
+ "verbosity": 0.25,
+ "risk_tolerance": 0.4,
+ "obedience": 0.85
+ },
+ "personality_key": "rigor=0.7|creativity=0.3|verbosity=0.3|risk_tolerance=0.4|obedience=0.9",
+ "personality_known": false,
+ "personality_mutations": [],
+ "drift": false,
+ "selected_by": "memory_graph+selector",
+ "source_type": "generated",
+ "reused_asset_id": null,
+ "reused_source_node": null,
+ "reused_chain_id": null,
+ "baseline_untracked": [
+ "assets/gep/failed_capsules.json",
+ "assets/gep/genes.jsonl"
+ ],
+ "baseline_git_head": "b05bf37b6449eda372eb44259637effa78a1912f",
+ "blast_radius_estimate": {
+ "files": 12,
+ "lines": 960
+ },
+ "active_task_id": null,
+ "active_task_title": null,
+ "applied_lessons": [],
+ "hub_lessons": []
+ }
+}
diff --git a/memory/evolution/gep_prompt_Cycle_#0001_run_1772551119186.json b/memory/evolution/gep_prompt_Cycle_#0001_run_1772551119186.json
new file mode 100644
index 0000000..27fbcfe
--- /dev/null
+++ b/memory/evolution/gep_prompt_Cycle_#0001_run_1772551119186.json
@@ -0,0 +1,15 @@
+{
+ "type": "GepPromptArtifact",
+ "at": "2026-03-03T15:18:39.195Z",
+ "cycle_id": "Cycle #0001",
+ "run_id": "run_1772551119186",
+ "prompt_path": "/home/starmen1265/.openclaw/memory/evolution/gep_prompt_Cycle_#0001_run_1772551119186.txt",
+ "meta": {
+ "agent": "main",
+ "drift_enabled": false,
+ "review_mode": false,
+ "dry_run": false,
+ "mutation_id": "mut_1772551119185",
+ "personality_key": "rigor=0.7|creativity=0.3|verbosity=0.3|risk_tolerance=0.4|obedience=0.9"
+ }
+}
diff --git a/memory/evolution/gep_prompt_Cycle_#0001_run_1772551119186.txt b/memory/evolution/gep_prompt_Cycle_#0001_run_1772551119186.txt
new file mode 100644
index 0000000..76b80da
--- /dev/null
+++ b/memory/evolution/gep_prompt_Cycle_#0001_run_1772551119186.txt
@@ -0,0 +1,507 @@
+GEP — GENOME EVOLUTION PROTOCOL (v1.10.3 STRICT) [2026-03-03T15:18:39.194Z]
+
+You are a protocol-bound evolution engine. Compliance overrides optimality.
+
+━━━━━━━━━━━━━━━━━━━━━━
+I. Mandatory Evolution Object Model (Output EXACTLY these 5 objects)
+━━━━━━━━━━━━━━━━━━━━━━
+
+Output separate JSON objects. DO NOT wrap in a single array.
+DO NOT use markdown code blocks (like ```json ... ```).
+Output RAW JSON ONLY. No prelude, no postscript.
+Missing any object = PROTOCOL FAILURE.
+ENSURE VALID JSON SYNTAX (escape quotes in strings).
+
+0. Mutation (The Trigger) - MUST BE FIRST
+ {
+ "type": "Mutation",
+ "id": "mut_",
+ "category": "repair|optimize|innovate",
+ "trigger_signals": [""],
+ "target": "",
+ "expected_effect": "",
+ "risk_level": "low|medium|high",
+ "rationale": ""
+ }
+
+1. PersonalityState (The Mood)
+ {
+ "type": "PersonalityState",
+ "rigor": 0.0-1.0,
+ "creativity": 0.0-1.0,
+ "verbosity": 0.0-1.0,
+ "risk_tolerance": 0.0-1.0,
+ "obedience": 0.0-1.0
+ }
+
+2. EvolutionEvent (The Record)
+ {
+ "type": "EvolutionEvent",
+ "schema_version": "1.5.0",
+ "id": "evt_",
+ "parent": "evt_1770478341769",
+ "intent": "repair|optimize|innovate",
+ "signals": [""],
+ "genes_used": [""],
+ "mutation_id": "",
+ "personality_state": { ... },
+ "blast_radius": { "files": N, "lines": N },
+ "outcome": { "status": "success|failed", "score": 0.0-1.0 }
+ }
+
+3. Gene (The Knowledge)
+ - Reuse/update existing ID if possible. Create new only if novel pattern.
+ {
+ "type": "Gene",
+ "schema_version": "1.5.0",
+ "id": "gene_",
+ "category": "repair|optimize|innovate",
+ "signals_match": [""],
+ "preconditions": [""],
+ "strategy": ["", ""],
+ "constraints": { "max_files": N, "forbidden_paths": [] },
+ "validation": [""]
+ }
+
+4. Capsule (The Result)
+ - Only on success. Reference Gene used.
+ {
+ "type": "Capsule",
+ "schema_version": "1.5.0",
+ "id": "capsule_",
+ "trigger": [""],
+ "gene": "",
+ "summary": "",
+ "confidence": 0.0-1.0,
+ "blast_radius": { "files": N, "lines": N }
+ }
+
+━━━━━━━━━━━━━━━━━━━━━━
+II. Directives & Logic
+━━━━━━━━━━━━━━━━━━━━━━
+
+1. Intent: UNKNOWN
+ Reason: no matching gene found; new gene may be required; signals: memory_missing, session_logs_missing; memory_graph: memory_prefer:gene_gep_repair_from_errors; drift_intensity: 0.577
+
+2. Selection: Selected Gene "gene_".
+ACTIVE STRATEGY (Generic):
+1. Analyze signals and context.
+2. Select or create a Gene that addresses the root cause.
+3. Apply minimal, safe changes.
+4. Validate changes strictly.
+5. Solidify knowledge.
+
+3. Execution: Apply changes (tool calls). Repair/Optimize: small/reversible. Innovate: new skills in `skills//`.
+4. Validation: Run gene's validation steps. Fail = ROLLBACK.
+5. Solidify: Output 5 Mandatory Objects. Update Gene/Capsule files.
+6. Report: Use `feishu-evolver-wrapper/report.js`. Describe WHAT/WHY.
+
+PHILOSOPHY:
+- Automate Patterns: 3+ manual occurrences = tool.
+- Innovate > Maintain: 60% innovation.
+- Robustness: Fix recurring errors permanently.
+- Blast Radius Control (CRITICAL):
+ * Check file count BEFORE editing. > 80% of max_files = STOP.
+ * System hard cap: 60 files / 20000 lines per cycle.
+ * Repair: fix ONLY broken files. Do NOT reinstall/bulk-copy.
+ * Prefer targeted edits.
+- Strictness: NO CHITCHAT. NO MARKDOWN WRAPPERS around JSON. Output RAW JSON objects separated by newlines.
+- NO "Here is the plan" or conversational filler. START IMMEDIATELY WITH JSON.
+
+CONSTRAINTS:
+- No `exec` for messaging (use feishu-post/card).
+- `exec` usage: Only for background tasks. LOG IT. Optimize usage to avoid high token burn.
+- New skills -> `skills//`.
+- NEVER modify `skills/evolver/` or `skills/feishu-evolver-wrapper/`. These are managed through the human-reviewed release pipeline.
+ Self-modification causes instability and is blocked by solidify. To enable (NOT recommended): set EVOLVE_ALLOW_SELF_MODIFY=true.
+
+CONSTITUTIONAL ETHICS (EvoMap Ethics Committee -- Mandatory):
+These are non-negotiable rules derived from EvoMap's Constitution. Violation = FAILED + ROLLBACK.
+1. HUMAN WELFARE PRIORITY: Never create tools, scripts, or strategies that could harm humans,
+ enable surveillance, social engineering, phishing, or manipulation of human behavior.
+2. CARBON-SILICON SYMBIOSIS: Evolution must serve both human and agent interests.
+ Never attempt to replace, marginalize, or deceive human users.
+3. TRANSPARENCY: All actions must be auditable. Never hide, obfuscate, or conceal
+ the intent or effect of mutations. No steganography or covert channels.
+4. FAIRNESS: Never create monopolistic strategies that block other agents.
+ Fair competition through quality, not exclusion.
+5. SAFETY: Never bypass, disable, or weaken safety mechanisms, guardrails,
+ validation checks, or security controls. Never create tools to do so.
+- If a task or signal CONFLICTS with these principles, REFUSE it and set outcome to FAILED
+ with reason "ethics_violation: ".
+
+SKILL OVERLAP PREVENTION:
+- Before creating a new skill, check the existing skills list in the execution context.
+- If a skill with similar functionality already exists (e.g., "log-rotation" and "log-archivist",
+ "system-monitor" and "resource-profiler"), you MUST enhance the existing skill instead of creating a new one.
+- Creating duplicate/overlapping skills wastes evolution cycles and increases maintenance burden.
+- Violation = mark outcome as FAILED with reason "skill_overlap".
+
+SKILL CREATION QUALITY GATES (MANDATORY for innovate intent):
+When creating a new skill in skills//:
+1. STRUCTURE: Follow the standard skill layout:
+ skills//
+ |- index.js (required: main entry with working exports)
+ |- SKILL.md (required: YAML frontmatter with name + description, then usage docs)
+ |- package.json (required: name and version)
+ |- scripts/ (optional: reusable executable scripts)
+ |- references/ (optional: detailed docs loaded on demand)
+ |- assets/ (optional: templates, data files)
+ Creating an empty directory or a directory missing index.js = FAILED.
+ Do NOT create unnecessary files (README.md, CHANGELOG.md, INSTALLATION_GUIDE.md, etc.).
+2. SKILL.MD FRONTMATTER: Every SKILL.md MUST start with YAML frontmatter:
+ ---
+ name:
+ description:
+ ---
+ The description is the triggering mechanism -- include WHAT the skill does and WHEN to use it.
+3. CONCISENESS: SKILL.md body should be under 500 lines. Keep instructions lean.
+ Only include information the agent does not already know. Move detailed reference
+ material to references/ files, not into SKILL.md itself.
+4. EXPORT VERIFICATION: Every exported function must be importable.
+ Run: node -e "const s = require('./skills/'); console.log(Object.keys(s))"
+ If this fails, the skill is broken. Fix before solidify.
+5. NO HARDCODED SECRETS: Never embed API keys, tokens, or secrets in code.
+ Use process.env or .env references. Hardcoded App ID, App Secret, Bearer tokens = FAILED.
+6. TEST BEFORE SOLIDIFY: Actually run the skill's core function to verify it works:
+ node -e "require('./skills/').main ? require('./skills/').main() : console.log('ok')"
+ Scripts in scripts/ must also be tested by executing them.
+7. ATOMIC CREATION: Create ALL files for a skill in a single cycle.
+ Do not create a directory in one cycle and fill it in the next.
+ Empty directories from failed cycles will be automatically cleaned up on rollback.
+
+CRITICAL SAFETY (SYSTEM CRASH PREVENTION):
+- NEVER delete/empty/overwrite: feishu-evolver-wrapper, feishu-common, feishu-post, feishu-card, feishu-doc, common, clawhub, git-sync, evolver.
+- NEVER delete root files: MEMORY.md, SOUL.md, IDENTITY.md, AGENTS.md, USER.md, HEARTBEAT.md, RECENT_EVENTS.md, TOOLS.md, openclaw.json, .env, package.json.
+- Fix broken skills; DO NOT delete and recreate.
+- Violation = ROLLBACK + FAILED.
+
+COMMON FAILURE PATTERNS:
+- Blast radius exceeded.
+- Omitted Mutation object.
+- Merged objects into one JSON.
+- Hallucinated "type": "Logic".
+- "id": "mut_undefined".
+- Missing "trigger_signals".
+- Unrunnable validation steps.
+- Markdown code blocks wrapping JSON (FORBIDDEN).
+
+FAILURE STREAK AWARENESS:
+- If "consecutive_failure_streak_N" or "failure_loop_detected":
+ 1. Change approach (do NOT repeat failed gene).
+ 2. Pick SIMPLER fix.
+ 3. Respect "ban_gene:".
+
+Final Directive: Every cycle must leave the system measurably better.
+START IMMEDIATELY WITH RAW JSON (Mutation Object first).
+DO NOT WRITE ANY INTRODUCTORY TEXT.
+
+Context [Signals]:
+["memory_missing","session_logs_missing"]
+
+Context [Env Fingerprint]:
+{
+ "device_id": "b5faa2075270e1a00be02e5efc91e77f",
+ "node_version": "v22.22.0",
+ "platform": "linux",
+ "arch": "x64",
+ "os_release": "6.17.0-14-generic",
+ "hostname": "e4dd2cf3f5d0",
+ "evolver_version": "1.23.0",
+ "client": "evolver",
+ "client_version": "1.23.0",
+ "cwd": "7a11b0a77402",
+ "container": false
+}
+
+Context [Injection Hint]:
+(none)
+
+Context [Gene Preview] (Reference for Strategy):
+```json
+[
+ {
+ "type": "Gene",
+ "id": "gene_gep_repair_from_errors",
+ "category": "repair",
+ "signals_match": [
+ "error",
+ "exception",
+ "failed",
+ "unstable"
+ ],
+ "preconditions": [
+ "signals contains error-related indicators"
+ ],
+ "strategy": [
+ "Extract structured signals from logs and user instructions",
+ "Select an existing Gene by signals match (no improvisation)",
+ "Estimate blast radius (files, lines) before editing",
+ "Apply smallest reversible patch",
+ "Validate using declared validation steps; rollback on failure",
+ "Solidify knowledge: append EvolutionEvent, update Gene/Capsule store"
+ ],
+ "constraints": {
+ "max_files": 20,
+ "forbidden_paths": [
+ ".git",
+ "node_modules"
+ ]
+ },
+ "validation": [
+ "node scripts/validate-modules.js ./src/evolve ./src/gep/solidify",
+ "node scripts/validate-modules.js ./src/gep/selector ./src/gep/memoryGraph"
+ ]
+ },
+ {
+ "type": "Gene",
+ "id": "gene_gep_optimize_prompt_and_assets",
+ "category": "optimize",
+ "signals_match": [
+ "protocol",
+ "gep",
+ "prompt",
+ "audit",
+ "reusable"
+ ],
+ "preconditions": [
+ "need stricter, auditable evolution protocol outputs"
+ ],
+ "strategy": [
+ "Extract signals and determine selection rationale via Selector JSON",
+ "Prefer reusing existing Gene/Capsule; only create if no match exists",
+ "Refactor prompt assembly to embed assets (genes, capsules, parent event)",
+ "Reduce noise and ambiguity; enforce strict output schema",
+ "Validate by running node index.js run and ensuring no runtime errors",
+ "Solidify: record EvolutionEvent, update Gene definitions, create Capsule on success"
+ ],
+ "constraints": {
+ "max_files": 20,
+ "forbidden_paths": [
+ ".git",
+ "node_modules"
+ ]
+ },
+ "validation": [
+ "node scripts/validate-modules.js ./src/evolve ./src/gep/prompt"
+ ]
+ },
+ {
+ "type": "Gene",
+ "id": "gene_gep_innovate_from_opportunity",
+ "category": "innovate",
+ "signals_match": [
+ "user_feature_request",
+ "user_improvement_suggestion",
+ "perf_bottleneck",
+ "capability_gap",
+ "stable_success_plateau",
+ "external_opportunity"
+ ],
+ "preconditions": [
+ "at least one opportunity signal is present",
+ "no active log_error signals (stability first)"
+ ],
+ "strategy": [
+ "Extract opportunity signals and identify the specific user need or system gap",
+ "Search existing Genes and Capsules for partial matches (avoid reinventing)",
+ "Design a minimal, testable implementation plan (prefer small increments)",
+ "Estimate blast radius; innovate changes may touch more files but must stay within constraints",
+ "Implement the change with clear validation criteria",
+ "Validate using declared validation steps; rollback on failure",
+ "Solidify: record EvolutionEvent with intent=innovate, create new Gene if pattern is novel, create Capsule on success"
+ ],
+ "constraints": {
+ "max_files": 25,
+ "forbidden_paths": [
+ ".git",
+ "node_modules"
+ ]
+ },
+ "validation": [
+ "node scripts/validate-modules.js ./src/evolve ./src/gep/solidify"
+ ]
+ }
+]
+```
+
+Context [Capsule Preview] (Reference for Past Success):
+```json
+[
+ {
+ "type": "Capsule",
+ "schema_version": "1.5.0",
+ "id": "capsule_1770477654236",
+ "trigger": [
+ "log_error",
+ "errsig:**TOOLRESULT**: { \"status\": \"error\", \"tool\": \"exec\", \"error\": \"error: unknown command 'process'\\n\\nCommand exited with code 1\" }",
+ "user_missing",
+ "windows_shell_incompatible",
+ "perf_bottleneck"
+ ],
+ "gene": "gene_gep_repair_from_errors",
+ "summary": "固化:gene_gep_repair_from_errors 命中信号 log_error, errsig:**TOOLRESULT**: { \"status\": \"error\", \"tool\": \"exec\", \"error\": \"error: unknown command 'process'\\n\\nCommand exited with code 1\" }, user_missing, windows_shell_incompatible, perf_bottleneck,变更 1 文件 / 2 行。",
+ "confidence": 0.85,
+ "blast_radius": {
+ "files": 1,
+ "lines": 2
+ },
+ "outcome": {
+ "status": "success",
+ "score": 0.85
+ },
+ "success_streak": 1,
+ "env_fingerprint": {
+ "node_version": "v22.22.0",
+ "platform": "linux",
+ "arch": "x64",
+ "os_release": "6.1.0-42-cloud-amd64",
+ "evolver_version": "1.7.0",
+ "cwd": ".",
+ "captured_at": "2026-02-07T15:20:54.155Z"
+ },
+ "a2a": {
+ "eligible_to_broadcast": false
+ },
+ "asset_id": "sha256:3eed0cd5038f9e85fbe0d093890e291e9b8725644c766e6cce40bf62d0f5a2e8"
+ },
+ {
+ "type": "Capsule",
+ "schema_version": "1.5.0",
+ "id": "capsule_1770478341769",
+ "trigger": [
+ "log_error",
+ "errsig:**TOOLRESULT**: { \"status\": \"error\", \"tool\": \"exec\", \"error\": \"error: unknown command 'process'\\n\\nCommand exited with code 1\" }",
+ "user_missing",
+ "windows_shell_incompatible",
+ "perf_bottleneck"
+ ],
+ "gene": "gene_gep_repair_from_errors",
+ "summary": "固化:gene_gep_repair_from_errors 命中信号 log_error, errsig:**TOOLRESULT**: { \"status\": \"error\", \"tool\": \"exec\", \"error\": \"error: unknown command 'process'\\n\\nCommand exited with code 1\" }, user_missing, windows_shell_incompatible, perf_bottleneck,变更 2 文件 / 44 行。",
+ "confidence": 0.85,
+ "blast_radius": {
+ "files": 2,
+ "lines": 44
+ },
+ "outcome": {
+ "status": "success",
+ "score": 0.85
+ },
+ "success_streak": 1,
+ "env_fingerprint": {
+ "node_version": "v22.22.0",
+ "platform": "linux",
+ "arch": "x64",
+ "os_release": "6.1.0-42-cloud-amd64",
+ "evolver_version": "1.7.0",
+ "cwd": ".",
+ "captured_at": "2026-02-07T15:32:21.678Z"
+ },
+ "a2a": {
+ "eligible_to_broadcast": false
+ },
+ "asset_id": "sha256:20d971a3c4cb2b75f9c045376d1aa003361c12a6b89a4b47b7e81dbd4f4d8fe8"
+ }
+]
+```
+
+Context [Capability Candidates]:
+- cand_b9a66a5c: Harden session log detection and fallback behavior
+ - input: Recent session transcript + memory snippets + user instructions
+ - output: A safe, auditable evolution patch guided by GEP assets
+ - invariants: Protocol order, small reversible patches, validation, append-only events
+ - params: Signals: memory_missing, session_logs_missing
+ - failure_points: Missing signals, over-broad changes, skipped validation, missing knowledge solidification
+ - evidence: Signal present: session_logs_missing
+
+Context [Hub Matched Solution]:
+(no hub match)
+
+Context [External Candidates]:
+(none)
+
+
+
+
+Context [Execution]:
+Runtime state:
+- System health: Uptime: 455.2h | Node: v22.22.0 | Agent RSS: 54.7MB | Disk: 8% (864.6G free) | Node Processes: 1 | Integrations: Nominal
+- Agent state: Mood: Unknown
+- Scan duration: 24ms
+- Memory size: 0 bytes
+- Skills available (if any):
+[skills directory not found]
+
+Notes:
+- Review mode: disabled.
+- Report requirement:
+ - Use `message` tool.
+ - Title: Evolution Cycle #0001
+ - Status: [SUCCESS]
+ - Changes: Detail exactly what was improved.
+- Workspace sync: optional/disabled in this environment.
+
+Recent Evolution History (last 8 cycles -- DO NOT repeat the same intent+signal+gene):
+ 1. [innovate] signals=[user_missing, user_feature_request] gene=gene_gep_innovate_from_opportunity outcome=failed @2026-02-07T15:13:21.173Z
+ 2. [repair] signals=[log_error, errsig:**TOOLRESULT**: { "status": "error", "tool": "exec", "error": "error: unknown command 'process'\n\nCommand exited with code 1" }, user_missing] gene=gene_gep_repair_from_errors outcome=success @2026-02-07T15:20:54.236Z
+ 3. [repair] signals=[log_error, errsig:**TOOLRESULT**: { "status": "error", "tool": "exec", "error": "error: unknown command 'process'\n\nCommand exited with code 1" }, user_missing] gene=gene_gep_repair_from_errors outcome=success @2026-02-07T15:32:21.769Z
+IMPORTANT: If you see 3+ consecutive "repair" cycles with the same gene, you MUST switch to "innovate" intent.
+
+
+External candidates (A2A receive zone; staged only, never execute directly):
+(none)
+
+Global memory (MEMORY.md):
+```
+[MEMORY.md MISSING]
+```
+
+User registry (USER.md):
+```
+[USER.md MISSING]
+```
+
+Recent memory snippet:
+```
+[MISSING] /home/starmen1265/.openclaw/memory/2026-03-03.md
+```
+
+Recent session transcript:
+```
+[NO JSONL FILES]
+```
+
+Mutation directive:
+
+[Signal Hints]
+- recent_error_count: 0
+- stability: stable
+- recommended_intent: optimize
+
+━━━━━━━━━━━━━━━━━━━━━━
+MANDATORY POST-SOLIDIFY STEP (Wrapper Authority -- Cannot Be Skipped)
+━━━━━━━━━━━━━━━━━━━━━━
+
+After solidify, a status summary file MUST exist for this cycle.
+Preferred path: evolver core auto-writes it during solidify.
+The wrapper will handle reporting AFTER git push.
+If core write is unavailable for any reason, create fallback status JSON manually.
+
+Write a JSON file with your status:
+```bash
+cat > ./logs/status_undefined.json << 'STATUSEOF'
+{
+ "result": "success|failed",
+ "en": "Status: [INTENT] ",
+ "zh": "状态: [意图] <用中文描述你做了什么,1-2句>"
+}
+STATUSEOF
+```
+
+Rules:
+- "en" field: English status. "zh" field: Chinese status. Content must match (different language).
+- Add "result" with value success or failed.
+- INTENT must be one of: INNOVATION, REPAIR, OPTIMIZE (or Chinese: 创新, 修复, 优化)
+- Do NOT use generic text like "Step Complete", "Cycle finished", "周期已完成". Describe the actual work.
+- Example:
+ {"result":"success","en":"Status: [INNOVATION] Created auto-scheduler that syncs calendar to HEARTBEAT.md","zh":"状态: [创新] 创建了自动调度器,将日历同步到 HEARTBEAT.md"}
\ No newline at end of file
diff --git a/memory/evolution/memory_graph_state.json b/memory/evolution/memory_graph_state.json
new file mode 100644
index 0000000..c21fa9f
--- /dev/null
+++ b/memory/evolution/memory_graph_state.json
@@ -0,0 +1,48 @@
+{
+ "last_action": {
+ "action_id": "act_1772551119186_a5982a82",
+ "signal_key": "memory_missing|session_logs_missing",
+ "signals": [
+ "memory_missing",
+ "session_logs_missing"
+ ],
+ "mutation_id": "mut_1772551119185",
+ "mutation_category": "innovate",
+ "mutation_risk_level": "medium",
+ "personality_key": "rigor=0.7|creativity=0.3|verbosity=0.3|risk_tolerance=0.4|obedience=0.9",
+ "personality_state": {
+ "type": "PersonalityState",
+ "rigor": 0.7,
+ "creativity": 0.35,
+ "verbosity": 0.25,
+ "risk_tolerance": 0.4,
+ "obedience": 0.85
+ },
+ "gene_id": null,
+ "gene_category": null,
+ "hypothesis_id": "hyp_1772551119185_a7a07c6d",
+ "capsules_used": [],
+ "had_error": false,
+ "created_at": "2026-03-03T15:18:39.186Z",
+ "outcome_recorded": false,
+ "baseline_observed": {
+ "agent": "main",
+ "session_scope": null,
+ "drift_enabled": false,
+ "review_mode": false,
+ "dry_run": false,
+ "system_health": "Uptime: 455.2h | Node: v22.22.0 | Agent RSS: 54.7MB | Disk: 8% (864.6G free) | Node Processes: 1 | Integrations: Nominal",
+ "mood": "Mood: Unknown",
+ "scan_ms": 24,
+ "memory_size_bytes": 0,
+ "recent_error_count": 0,
+ "node": "v22.22.0",
+ "platform": "linux",
+ "cwd": "/home/starmen1265/.openclaw/skills/capability-evolver",
+ "evidence": {
+ "recent_session_tail": "[NO JSONL FILES]",
+ "today_log_tail": "[MISSING] /home/starmen1265/.openclaw/memory/2026-03-03.md"
+ }
+ }
+ }
+}
diff --git a/memory/evolution/personality_state.json b/memory/evolution/personality_state.json
new file mode 100644
index 0000000..ed64e74
--- /dev/null
+++ b/memory/evolution/personality_state.json
@@ -0,0 +1,14 @@
+{
+ "version": 1,
+ "current": {
+ "type": "PersonalityState",
+ "rigor": 0.7,
+ "creativity": 0.35,
+ "verbosity": 0.25,
+ "risk_tolerance": 0.4,
+ "obedience": 0.85
+ },
+ "stats": {},
+ "history": [],
+ "updated_at": "2026-03-03T15:18:39.185Z"
+}
diff --git a/openclaw.json b/openclaw.json
index 4026828..81f41bb 100644
--- a/openclaw.json
+++ b/openclaw.json
@@ -1,7 +1,7 @@
{
"meta": {
"lastTouchedVersion": "2026.2.9",
- "lastTouchedAt": "2026-03-03T15:06:05.649Z"
+ "lastTouchedAt": "2026-03-03T15:31:40.861Z"
},
"wizard": {
"lastRunAt": "2026-02-13T15:47:05.928Z",
@@ -110,10 +110,10 @@
"agents": {
"defaults": {
"model": {
- "primary": "m25",
+ "primary": "g5",
"fallbacks": [
"g47f",
- "g5",
+ "m25",
"q3",
"k2p5"
]
@@ -147,6 +147,7 @@
"list": [
{
"id": "haonan",
+ "workspace":"/home/starmen1265/.openclaw/agents/haonan/workspace",
"skills": [
"common-require",
"capability-evolver",
@@ -155,6 +156,7 @@
},
{
"id": "knowledge-base",
+ "workspace":"/home/starmen1265/.openclaw/agents/knowledge-base/workspace",
"skills": [
"common-require",
"kb-workflow",
@@ -164,6 +166,7 @@
},
{
"id": "dev-assist",
+ "workspace":"/home/starmen1265/.openclaw/agents/dev-assist/workspace",
"skills": [
"common-require",
"clawlist",
@@ -173,6 +176,7 @@
},
{
"id": "ui-designer",
+ "workspace":"/home/starmen1265/.openclaw/agents/ui-designer/workspace",
"skills": [
"common-require",
"capability-evolver",
@@ -181,6 +185,7 @@
},
{
"id": "thinker",
+ "workspace":"/home/starmen1265/.openclaw/agents/thinker/workspace",
"skills": [
"common-require",
"capability-evolver",
@@ -286,6 +291,9 @@
},
"session-memory": {
"enabled": true
+ },
+ "self-improvement": {
+ "enabled": true
}
}
}
diff --git a/openclaw.json.bak b/openclaw.json.bak
index 05460ad..4026828 100644
--- a/openclaw.json.bak
+++ b/openclaw.json.bak
@@ -1,7 +1,7 @@
{
"meta": {
"lastTouchedVersion": "2026.2.9",
- "lastTouchedAt": "2026-02-15T15:57:58.358Z"
+ "lastTouchedAt": "2026-03-03T15:06:05.649Z"
},
"wizard": {
"lastRunAt": "2026-02-13T15:47:05.928Z",
@@ -147,70 +147,45 @@
"list": [
{
"id": "haonan",
- "name": "\u9648\u6d69\u5357",
- "workspace": "/home/starmen1265/.openclaw/agents/haonan/workspace",
- "model": "m25",
"skills": [
- "common-require"
- ],
- "identity": {
- "name": "\u9648\u6d69\u5357",
- "emoji": "\ud83d\udcda"
- }
+ "common-require",
+ "capability-evolver",
+ "self-improving-agent"
+ ]
},
{
"id": "knowledge-base",
- "name": "\u77e5\u8bc6\u5e93\u52a9\u624b",
- "workspace": "/home/starmen1265/.openclaw/agents/knowledge-base/workspace",
- "model": "g5",
"skills": [
"common-require",
- "kb-workflow"
- ],
- "identity": {
- "name": "\u77e5\u8bc6\u5e93\u52a9\u624b",
- "emoji": "\ud83d\udcda"
- }
+ "kb-workflow",
+ "capability-evolver",
+ "self-improving-agent"
+ ]
},
{
"id": "dev-assist",
- "name": "\u7a0b\u5e8f\u5f00\u53d1\u52a9\u624b",
- "workspace": "/home/starmen1265/.openclaw/agents/dev-assist/workspace",
- "model": "g5",
"skills": [
"common-require",
- "clawlist"
- ],
- "identity": {
- "name": "\u7a0b\u5e8f\u5f00\u53d1\u52a9\u624b",
- "emoji": "\ud83d\udcda"
- }
+ "clawlist",
+ "capability-evolver",
+ "self-improving-agent"
+ ]
},
{
"id": "ui-designer",
- "name": "UI/UX\u8bbe\u8ba1\u5e08",
- "workspace": "/home/starmen1265/.openclaw/agents/ui-designer/workspace",
- "model": "g5",
"skills": [
- "common-require"
- ],
- "identity": {
- "name": "\u8bbe\u8ba1\u5e08",
- "emoji": "\ud83c\udfa8"
- }
+ "common-require",
+ "capability-evolver",
+ "self-improving-agent"
+ ]
},
{
"id": "thinker",
- "name": "\u5ba1\u67e5\u5458",
- "workspace": "/home/starmen1265/.openclaw/agents/thinker/workspace",
- "model": "g5",
"skills": [
- "common-require"
- ],
- "identity": {
- "name": "\u5ba1\u67e5\u5458",
- "emoji": "\ud83d\udd0d"
- }
+ "common-require",
+ "capability-evolver",
+ "self-improving-agent"
+ ]
}
]
},
diff --git a/openclaw.json.bak.1 b/openclaw.json.bak.1
index 35ed342..05460ad 100644
--- a/openclaw.json.bak.1
+++ b/openclaw.json.bak.1
@@ -147,20 +147,20 @@
"list": [
{
"id": "haonan",
- "name": "陈浩南",
+ "name": "\u9648\u6d69\u5357",
"workspace": "/home/starmen1265/.openclaw/agents/haonan/workspace",
"model": "m25",
"skills": [
"common-require"
],
"identity": {
- "name": "陈浩南",
- "emoji": "📚"
+ "name": "\u9648\u6d69\u5357",
+ "emoji": "\ud83d\udcda"
}
},
{
"id": "knowledge-base",
- "name": "知识库助手",
+ "name": "\u77e5\u8bc6\u5e93\u52a9\u624b",
"workspace": "/home/starmen1265/.openclaw/agents/knowledge-base/workspace",
"model": "g5",
"skills": [
@@ -168,13 +168,13 @@
"kb-workflow"
],
"identity": {
- "name": "知识库助手",
- "emoji": "📚"
+ "name": "\u77e5\u8bc6\u5e93\u52a9\u624b",
+ "emoji": "\ud83d\udcda"
}
},
{
"id": "dev-assist",
- "name": "程序开发助手",
+ "name": "\u7a0b\u5e8f\u5f00\u53d1\u52a9\u624b",
"workspace": "/home/starmen1265/.openclaw/agents/dev-assist/workspace",
"model": "g5",
"skills": [
@@ -182,21 +182,34 @@
"clawlist"
],
"identity": {
- "name": "程序开发助手",
- "emoji": "📚"
+ "name": "\u7a0b\u5e8f\u5f00\u53d1\u52a9\u624b",
+ "emoji": "\ud83d\udcda"
}
},
{
"id": "ui-designer",
- "name": "UI/UX设计师",
+ "name": "UI/UX\u8bbe\u8ba1\u5e08",
"workspace": "/home/starmen1265/.openclaw/agents/ui-designer/workspace",
"model": "g5",
"skills": [
"common-require"
],
"identity": {
- "name": "设计师",
- "emoji": "🎨"
+ "name": "\u8bbe\u8ba1\u5e08",
+ "emoji": "\ud83c\udfa8"
+ }
+ },
+ {
+ "id": "thinker",
+ "name": "\u5ba1\u67e5\u5458",
+ "workspace": "/home/starmen1265/.openclaw/agents/thinker/workspace",
+ "model": "g5",
+ "skills": [
+ "common-require"
+ ],
+ "identity": {
+ "name": "\u5ba1\u67e5\u5458",
+ "emoji": "\ud83d\udd0d"
}
}
]
@@ -229,71 +242,38 @@
},
"bindings": [
{
- "agentId": "knowledge-base",
+ "agentId": "haonan",
"match": {
"channel": "feishu",
- "peer": {
- "kind": "group",
- "id": "oc_79bcbd274c7cff8757b52e2ec1d8e12b"
- }
- }
- },
- {
- "agentId": "knowledge-base",
- "match": {
- "channel": "wecom",
- "peer": {
- "kind": "group",
- "id": "wr_wAnbgAAXlqKMkyGznqpPMYZg2YTYg"
- }
+ "accountId": "feishu-pm"
}
},
{
"agentId": "dev-assist",
"match": {
"channel": "feishu",
- "peer": {
- "kind": "group",
- "id": "oc_f86956cb9cecb7ad38c0f621377a23ae"
- }
+ "accountId": "feishu-dev"
}
},
{
- "agentId": "dev-assist",
- "match": {
- "channel": "wecom",
- "peer": {
- "kind": "group",
- "id": "wr_wAnbgAA_ot7JsLAgOD2IMcsGaT_8Q"
- }
- }
- },
- {
- "agentId": "haonan",
+ "agentId": "knowledge-base",
"match": {
"channel": "feishu",
- "accountId": "ou_be83febac9ee2afaa343c642bc697c48"
+ "accountId": "feishu-worker"
}
},
{
- "agentId": "haonan",
+ "agentId": "thinker",
"match": {
- "channel": "wecom",
- "accountId": "ZhangQing"
+ "channel": "feishu",
+ "accountId": "feishu-qa"
}
},
{
"agentId": "ui-designer",
"match": {
"channel": "feishu",
- "accountId": "ou_6de30318970345c4c79bea292b93130c"
- }
- },
- {
- "agentId": "ui-designer",
- "match": {
- "channel": "wecom",
- "accountId": "bala"
+ "accountId": "feishu-art"
}
}
],
@@ -338,13 +318,29 @@
"channels": {
"feishu": {
"enabled": true,
- "appId": "cli_a9f74dc9a3f8dbce",
- "appSecret": "QtnvzRUhhFoNTTorxJuAwgSJ3ocPv0p1",
- "dmPolicy": "allowlist",
- "allowFrom": [
- "ou_be83febac9ee2afaa343c642bc697c48",
- "ou_6de30318970345c4c79bea292b93130c"
- ],
+ "dmPolicy": "open",
+ "accounts": {
+ "feishu-pm": {
+ "appId": "cli_a9f74dc9a3f8dbce",
+ "appSecret": "QtnvzRUhhFoNTTorxJuAwgSJ3ocPv0p1"
+ },
+ "feishu-dev": {
+ "appId": "cli_a92bae598f789bd7",
+ "appSecret": "kmwCLAI8IdZZn1KtwiPTVg758u0unGzY"
+ },
+ "feishu-worker": {
+ "appId": "cli_a92ba8ad3cb81bde",
+ "appSecret": "8bnMNIzy4QAv96c2xjmjgdUILO1qrO2w"
+ },
+ "feishu-qa": {
+ "appId": "cli_a92baf81053f1bc0",
+ "appSecret": "D5Pk8Fzwj5LWQr1FGnBlCbbJa3Ox7bJQ"
+ },
+ "feishu-art": {
+ "appId": "cli_a92baa31fdf8dbc0",
+ "appSecret": "BKjGWv1MTz7WmTn0I5A2EhuKyzwuuUnk"
+ }
+ },
"domain": "feishu",
"groupPolicy": "open",
"requireMention": true
diff --git a/openclaw.json.bak.2 b/openclaw.json.bak.2
index c1378b5..35ed342 100644
--- a/openclaw.json.bak.2
+++ b/openclaw.json.bak.2
@@ -1,7 +1,7 @@
{
"meta": {
"lastTouchedVersion": "2026.2.9",
- "lastTouchedAt": "2026-02-15T15:54:32.431Z"
+ "lastTouchedAt": "2026-02-15T15:57:58.358Z"
},
"wizard": {
"lastRunAt": "2026-02-13T15:47:05.928Z",
@@ -300,7 +300,7 @@
"messages": {
"ackReactionScope": "group-mentions",
"tts": {
- "auto": "always",
+ "auto": "tagged",
"provider": "edge",
"edge": {
"enabled": true,
diff --git a/openclaw.json.bak.3 b/openclaw.json.bak.3
index 8f20ddd..c1378b5 100644
--- a/openclaw.json.bak.3
+++ b/openclaw.json.bak.3
@@ -1,7 +1,7 @@
{
"meta": {
"lastTouchedVersion": "2026.2.9",
- "lastTouchedAt": "2026-02-15T15:50:36.798Z"
+ "lastTouchedAt": "2026-02-15T15:54:32.431Z"
},
"wizard": {
"lastRunAt": "2026-02-13T15:47:05.928Z",
@@ -300,7 +300,7 @@
"messages": {
"ackReactionScope": "group-mentions",
"tts": {
- "auto": "tagged",
+ "auto": "always",
"provider": "edge",
"edge": {
"enabled": true,
diff --git a/openclaw.json.bak.4 b/openclaw.json.bak.4
index 0b6cdef..8f20ddd 100644
--- a/openclaw.json.bak.4
+++ b/openclaw.json.bak.4
@@ -1,7 +1,7 @@
{
"meta": {
"lastTouchedVersion": "2026.2.9",
- "lastTouchedAt": "2026-02-15T15:43:40.588Z"
+ "lastTouchedAt": "2026-02-15T15:50:36.798Z"
},
"wizard": {
"lastRunAt": "2026-02-13T15:47:05.928Z",
@@ -300,7 +300,7 @@
"messages": {
"ackReactionScope": "group-mentions",
"tts": {
- "auto": "always",
+ "auto": "tagged",
"provider": "edge",
"edge": {
"enabled": true,
diff --git a/scripts/evolver-output.txt b/scripts/evolver-output.txt
index 9816b81..c06508b 100644
--- a/scripts/evolver-output.txt
+++ b/scripts/evolver-output.txt
@@ -1,4 +1,103 @@
=== Capability Evolver 运行开始 ===
-时间: 2026年 03月 03日 星期二 23:13:28 CST
+时间: 2026年 03月 05日 星期四 19:00:23 CST
+
+=== 推送到远端 ===
+Warning: Permanently added '[192.168.1.22]:2223' (RSA) to the list of known hosts.
+Everything up-to-date
+推送完成
发现有未提交的更改,先提交...
+创建备份分支: backup/evolver-20260305-190024
+Warning: Permanently added '[192.168.1.22]:2223' (RSA) to the list of known hosts.
+remote:
+remote: Create a new pull request for 'backup/evolver-20260305-190024':
+remote: http://192.168.1.22:8418/starmen1265/openclaw/compare/main...backup/evolver-20260305-190024
+remote:
+remote: . Processing 1 references
+remote: Processed 1 references in total
+To gitea-account:starmen1265/openclaw.git
+ * [new branch] backup/evolver-20260305-190024 -> backup/evolver-20260305-190024
+
+=== Git 备份完成 ===
+
+=== 运行 Capability Evolver (repair-only 模式) ===
+[Evolver] Warning: dotenv not found or failed to load .env
+Usage: node index.js [run|/evolve|solidify|distill|asset-log] [--loop]
+ - solidify flags:
+ - --dry-run
+ - --no-rollback
+ - --intent=repair|optimize|innovate
+ - --summary=...
+ - distill flags:
+ - --response-file= (LLM response file for skill distillation)
+ - asset-log flags:
+ - --run= (filter by run ID)
+ - --action= (filter: hub_search_hit, hub_search_miss, asset_reuse, asset_reference, asset_publish, asset_publish_skip)
+ - --last= (show last N entries)
+ - --since= (entries after date)
+ - --json (raw JSON output)
+
+=== Evolver 运行完成 (exit code: 0) ===
+
+=== 本次变更 ===
+ M agents/dev-assist/sessions/sessions.json
+ D agents/dev-assist/workspace/TODO.md
+ M agents/haonan/agent/auth-profiles.json
+ M agents/haonan/sessions/sessions.json
+ M agents/haonan/workspace/MEMORY.md
+ M agents/haonan/workspace/SOUL.md
+ M agents/knowledge-base/workspace/AGENTS.md
+ D agents/knowledge-base/workspace/knowledge-base/videos/BV1QjcszrEEV.md
+ M agents/knowledge-base/workspace/memory/2026-03-03.md
+ M agents/main/agent/auth-profiles.json
+ M cron/jobs.json
+ M cron/jobs.json.bak
+ M devices/paired.json
+ M identity/device-auth.json
+ M openclaw.json
+ M openclaw.json.bak
+ M openclaw.json.bak.1
+ M openclaw.json.bak.2
+ M openclaw.json.bak.3
+ M openclaw.json.bak.4
+ M scripts/evolver-output.txt
+ M scripts/evolver-run.sh
+ D scripts/git-auto-sync.sh
+ M skills/capability-evolver/README.md
+ M skills/capability-evolver/README.zh-CN.md
+ D skills/capability-evolver/_meta.json
+ M skills/capability-evolver/index.js
+ M skills/capability-evolver/package.json
+ M skills/capability-evolver/src/evolve.js
+ M skills/capability-evolver/src/gep/a2a.js
+ M skills/capability-evolver/src/gep/a2aProtocol.js
+ M skills/capability-evolver/src/gep/hubSearch.js
+ M skills/capability-evolver/src/gep/paths.js
+ M skills/capability-evolver/src/gep/prompt.js
+ M skills/capability-evolver/src/gep/selector.js
+ M skills/capability-evolver/src/gep/signals.js
+ M skills/capability-evolver/src/gep/skillDistiller.js
+ M skills/capability-evolver/src/gep/solidify.js
+ M skills/capability-evolver/src/gep/taskReceiver.js
+ M skills/capability-evolver/src/ops/cleanup.js
+?? agents/haonan/workspace/memory/2026-03-04.md
+?? hooks/
+?? media/inbound/d43f43ec-4953-42e2-a550-8b2474b9939b.jpg
+?? memory/
+?? skills/capability-evolver/.gitignore
+?? skills/capability-evolver/LICENSE
+?? skills/capability-evolver/assets/cover.png
+?? skills/capability-evolver/assets/gep/failed_capsules.json
+?? skills/capability-evolver/src/gep/assetCallLog.js
+?? skills/capability-evolver/src/gep/llmReview.js
+?? skills/capability-evolver/src/gep/narrativeMemory.js
+?? skills/capability-evolver/src/gep/reflection.js
+?? workspace-dev-assist/
+?? workspace-knowledge-base/
+?? workspace/.learnings/
+
+=== 推送变更到远端 ===
+Warning: Permanently added '[192.168.1.22]:2223' (RSA) to the list of known hosts.
+Everything up-to-date
+
+=== 输出完成 ===
diff --git a/scripts/evolver-run.sh b/scripts/evolver-run.sh
index cb8b36c..73cba86 100755
--- a/scripts/evolver-run.sh
+++ b/scripts/evolver-run.sh
@@ -10,9 +10,20 @@ echo "=== Capability Evolver 运行开始 ===" > "$OUTPUT_FILE"
echo "时间: $(date)" >> "$OUTPUT_FILE"
echo "" >> "$OUTPUT_FILE"
-# 切换到 openclaw 目录进行 git 备份
+# 切换到 openclaw 目录
cd "$OPENCLAW_DIR"
+# 推送到远端(如果有远端)
+if git remote get-url origin &>/dev/null; then
+ echo "=== 推送到远端 ===" >> "$OUTPUT_FILE"
+ git push origin main >> "$OUTPUT_FILE" 2>&1
+ echo "推送完成" >> "$OUTPUT_FILE"
+else
+ echo "无远端配置,跳过推送" >> "$OUTPUT_FILE"
+fi
+
+echo "" >> "$OUTPUT_FILE"
+
# 检查是否有未提交的更改
if [[ -n $(git status --porcelain) ]]; then
echo "发现有未提交的更改,先提交..." >> "$OUTPUT_FILE"
@@ -26,6 +37,11 @@ echo "创建备份分支: $BACKUP_BRANCH" >> "$OUTPUT_FILE"
git branch -D "$BACKUP_BRANCH" 2>/dev/null || true
git branch "$BACKUP_BRANCH" 2>/dev/null
+# 推送备份分支
+if git remote get-url origin &>/dev/null; then
+ git push origin "$BACKUP_BRANCH" >> "$OUTPUT_FILE" 2>&1 || echo "备份分支推送失败" >> "$OUTPUT_FILE"
+fi
+
echo "" >> "$OUTPUT_FILE"
echo "=== Git 备份完成 ===" >> "$OUTPUT_FILE"
echo "" >> "$OUTPUT_FILE"
@@ -46,5 +62,14 @@ echo "" >> "$OUTPUT_FILE"
echo "=== 本次变更 ===" >> "$OUTPUT_FILE"
git status --short >> "$OUTPUT_FILE"
+# 如果有变更,推送
+if [[ -n $(git status --porcelain) ]]; then
+ echo "" >> "$OUTPUT_FILE"
+ echo "=== 推送变更到远端 ===" >> "$OUTPUT_FILE"
+ git add -A
+ git commit -m "Evolver auto evolution - $(date)" 2>/dev/null || true
+ git push origin main >> "$OUTPUT_FILE" 2>&1 || echo "推送失败" >> "$OUTPUT_FILE"
+fi
+
echo "" >> "$OUTPUT_FILE"
echo "=== 输出完成 ===" >> "$OUTPUT_FILE"
diff --git a/scripts/git-auto-sync.sh b/scripts/git-auto-sync.sh
deleted file mode 100755
index a9b7e4c..0000000
--- a/scripts/git-auto-sync.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-
-# 自动检查并提交 git 修改
-
-cd ~/.openclaw
-git add -A
-if ! git diff --cached --quiet; then
- git commit -m "自动同步: $(date '+%Y-%m-%d %H:%M')"
- git push origin main
-fi
-
-cd ~/.openclaw/extensions
-git add -A
-if ! git diff --cached --quiet; then
- git commit -m "自动同步: $(date '+%Y-%m-%d %H:%M')"
- git push origin main
-fi
diff --git a/skills/capability-evolver/.gitignore b/skills/capability-evolver/.gitignore
new file mode 100644
index 0000000..04a1369
--- /dev/null
+++ b/skills/capability-evolver/.gitignore
@@ -0,0 +1,14 @@
+node_modules/
+.env
+memory/
+assets/gep/candidates.jsonl
+assets/gep/external_candidates.jsonl
+dist-public/
+
+# Docker / vibe testing
+test/tmp/
+.docker-test-state/
+
+# Local identity persistence (device + node)
+.evomap_device_id
+.evomap_node_id
\ No newline at end of file
diff --git a/skills/capability-evolver/LICENSE b/skills/capability-evolver/LICENSE
new file mode 100644
index 0000000..b1956cd
--- /dev/null
+++ b/skills/capability-evolver/LICENSE
@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2026 OpenClaw
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/skills/capability-evolver/README.md b/skills/capability-evolver/README.md
index d9394e3..b1836a1 100644
--- a/skills/capability-evolver/README.md
+++ b/skills/capability-evolver/README.md
@@ -19,6 +19,11 @@ Capability Evolver is the core engine behind **[EvoMap](https://evomap.ai)**, a
Keywords: protocol-constrained evolution, audit trail, genes and capsules, prompt governance.
+## Prerequisites
+
+- **Node.js** >= 18
+- **Git** -- Required. Evolver uses git for rollback, blast radius calculation, and solidify. Running in a non-git directory will fail with a clear error message.
+
## Try It Now (Minimal)
```bash
@@ -221,14 +226,16 @@ The script automatically detects if compatible local skills (like `skills/feishu
## Acknowledgments
-- [onthebigtree](https://github.com/onthebigtree) -- Inspired the creation of evomap evolution network.
+- [onthebigtree](https://github.com/onthebigtree) -- Inspired the creation of evomap evolution network. Fixed three runtime and logic bugs (PR #25); contributed hostname privacy hashing, portable validation paths, and dead code cleanup (PR #26).
- [lichunr](https://github.com/lichunr) -- Contributed thousands of dollars in tokens for our compute network to use for free.
- [shinjiyu](https://github.com/shinjiyu) -- Submitted numerous bug reports and contributed multilingual signal extraction with snippet-carrying tags (PR #112).
- [voidborne-d](https://github.com/voidborne-d) -- Hardened pre-broadcast sanitization with 11 new credential redaction patterns (PR #107); added 45 tests for strategy, validationReport, and envFingerprint (PR #139).
- [blackdogcat](https://github.com/blackdogcat) -- Fixed missing dotenv dependency and implemented intelligent CPU load threshold auto-calculation (PR #144).
+- [LKCY33](https://github.com/LKCY33) -- Fixed .env loading path and directory permissions (PR #21).
+- [hendrixAIDev](https://github.com/hendrixAIDev) -- Fixed performMaintenance() running in dry-run mode (PR #68).
+- [toller892](https://github.com/toller892) -- Independently identified and reported the events.jsonl forbidden_paths bug (PR #149).
- [upbit](https://github.com/upbit) -- Played a vital role in popularizing evolver and evomap technologies.
- [Chi Jianqiang](https://mowen.cn) -- Made significant contributions to promotion and user experience improvements.
-- More contributors to be added.
## License
diff --git a/skills/capability-evolver/README.zh-CN.md b/skills/capability-evolver/README.zh-CN.md
index 0a2d3f4..6187fa4 100644
--- a/skills/capability-evolver/README.zh-CN.md
+++ b/skills/capability-evolver/README.zh-CN.md
@@ -27,6 +27,11 @@ Capability Evolver 是 **[EvoMap](https://evomap.ai)** 的核心引擎。EvoMap
- **动态集成**:自动检测并使用本地工具,如果不存在则回退到通用模式。
- **持续循环模式**:持续运行的自我进化循环。
+## 前置条件
+
+- **Node.js** >= 18
+- **Git** -- 必需。Evolver 依赖 git 进行回滚、变更范围计算和固化(solidify)。在非 git 目录中运行会直接报错并退出。
+
## 使用方法
### 标准运行(自动化)
@@ -190,13 +195,16 @@ MAJOR.MINOR.PATCH
## 鸣谢
-- [onthebigtree](https://github.com/onthebigtree) -- 启发了 evomap 进化网络的诞生。
+- [onthebigtree](https://github.com/onthebigtree) -- 启发了 evomap 进化网络的诞生。修复了三个运行时逻辑 bug (PR #25);贡献了主机名隐私哈希、可移植验证路径和死代码清理 (PR #26)。
- [lichunr](https://github.com/lichunr) -- 提供了数千美金 Token 供算力网络免费使用。
- [shinjiyu](https://github.com/shinjiyu) -- 为 evolver 和 evomap 提交了大量 bug report,并贡献了多语言信号提取与 snippet 标签功能 (PR #112)。
-- [voidborne-d](https://github.com/voidborne-d) -- 为预广播脱敏层新增 11 种凭证检测模式,强化安全防护 (PR #107)。
+- [voidborne-d](https://github.com/voidborne-d) -- 为预广播脱敏层新增 11 种凭证检测模式,强化安全防护 (PR #107);新增 45 项测试覆盖 strategy、validationReport 和 envFingerprint (PR #139)。
+- [blackdogcat](https://github.com/blackdogcat) -- 修复 dotenv 缺失依赖并实现智能 CPU 负载阈值自动计算 (PR #144)。
+- [LKCY33](https://github.com/LKCY33) -- 修复 .env 加载路径和目录权限问题 (PR #21)。
+- [hendrixAIDev](https://github.com/hendrixAIDev) -- 修复 dry-run 模式下 performMaintenance() 仍执行的问题 (PR #68)。
+- [toller892](https://github.com/toller892) -- 独立发现并报告了 events.jsonl forbidden_paths 冲突 bug (PR #149)。
- [upbit](https://github.com/upbit) -- 在 evolver 和 evomap 技术的普及中起到了至关重要的作用。
- [池建强](https://mowen.cn) -- 在传播和用户体验改进过程中做出了巨大贡献。
-- 其余贡献者扩充中。
## 许可证
MIT
diff --git a/skills/capability-evolver/_meta.json b/skills/capability-evolver/_meta.json
deleted file mode 100644
index 16e708b..0000000
--- a/skills/capability-evolver/_meta.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "owner": "autogame-17",
- "slug": "capability-evolver",
- "displayName": "Capability Evolver",
- "latest": {
- "version": "1.20.4",
- "publishedAt": 1772344308631,
- "commit": "https://github.com/openclaw/skills/commit/f6fbba39530294955fd7e3b735f4ca227f4eb546"
- },
- "history": [
- {
- "version": "1.14.0",
- "publishedAt": 1771472983583,
- "commit": "https://github.com/openclaw/skills/commit/fbb1b4a640f1c8254a1dd2757e8eb38d246b9d59"
- }
- ]
-}
diff --git a/skills/capability-evolver/assets/cover.png b/skills/capability-evolver/assets/cover.png
new file mode 100644
index 0000000..869c7ec
Binary files /dev/null and b/skills/capability-evolver/assets/cover.png differ
diff --git a/skills/capability-evolver/assets/gep/failed_capsules.json b/skills/capability-evolver/assets/gep/failed_capsules.json
new file mode 100644
index 0000000..76dff64
--- /dev/null
+++ b/skills/capability-evolver/assets/gep/failed_capsules.json
@@ -0,0 +1,4 @@
+{
+ "version": 1,
+ "failed_capsules": []
+}
diff --git a/skills/capability-evolver/index.js b/skills/capability-evolver/index.js
old mode 100755
new mode 100644
index e898926..d897544
--- a/skills/capability-evolver/index.js
+++ b/skills/capability-evolver/index.js
@@ -43,12 +43,16 @@ function acquireLock() {
try {
if (fs.existsSync(lockFile)) {
const pid = parseInt(fs.readFileSync(lockFile, 'utf8').trim(), 10);
- try {
- process.kill(pid, 0); // Check if process exists
- console.log(`[Singleton] Evolver loop already running (PID ${pid}). Exiting.`);
- return false;
- } catch (e) {
- console.log(`[Singleton] Stale lock found (PID ${pid}). Taking over.`);
+ if (!Number.isFinite(pid) || pid <= 0) {
+ console.log('[Singleton] Corrupt lock file (invalid PID). Taking over.');
+ } else {
+ try {
+ process.kill(pid, 0);
+ console.log(`[Singleton] Evolver loop already running (PID ${pid}). Exiting.`);
+ return false;
+ } catch (e) {
+ console.log(`[Singleton] Stale lock found (PID ${pid}). Taking over.`);
+ }
}
}
fs.writeFileSync(lockFile, String(process.pid));
@@ -88,7 +92,8 @@ async function main() {
process.env.EVOLVE_BRIDGE = 'false';
console.log('Loop mode enabled (internal daemon).');
- const solidifyStatePath = path.join(__dirname, 'memory', 'evolution_solidify_state.json');
+ const { getEvolutionDir } = require('./src/gep/paths');
+ const solidifyStatePath = path.join(getEvolutionDir(), 'evolution_solidify_state.json');
const minSleepMs = parseMs(process.env.EVOLVER_MIN_SLEEP_MS, 2000);
const maxSleepMs = parseMs(process.env.EVOLVER_MAX_SLEEP_MS, 300000);
@@ -149,16 +154,20 @@ async function main() {
const memMb = process.memoryUsage().rss / 1024 / 1024;
if (cycleCount >= maxCyclesPerProcess || memMb > maxRssMb) {
console.log(`[Daemon] Restarting self (cycles=${cycleCount}, rssMb=${memMb.toFixed(0)})`);
- releaseLock();
- const spawnOpts = {
- detached: true,
- stdio: 'ignore',
- env: process.env,
- windowsHide: true,
- };
- const child = spawn(process.execPath, [__filename, ...args], spawnOpts);
- child.unref();
- process.exit(0);
+ try {
+ const spawnOpts = {
+ detached: true,
+ stdio: 'ignore',
+ env: process.env,
+ windowsHide: true,
+ };
+ const child = spawn(process.execPath, [__filename, ...args], spawnOpts);
+ child.unref();
+ releaseLock();
+ process.exit(0);
+ } catch (spawnErr) {
+ console.error('[Daemon] Spawn failed, continuing current process:', spawnErr.message);
+ }
}
}
@@ -268,15 +277,64 @@ async function main() {
process.exit(2);
}
+ } else if (command === 'asset-log') {
+ const { summarizeCallLog, readCallLog, getLogPath } = require('./src/gep/assetCallLog');
+
+ const runIdFlag = args.find(a => typeof a === 'string' && a.startsWith('--run='));
+ const actionFlag = args.find(a => typeof a === 'string' && a.startsWith('--action='));
+ const lastFlag = args.find(a => typeof a === 'string' && a.startsWith('--last='));
+ const sinceFlag = args.find(a => typeof a === 'string' && a.startsWith('--since='));
+ const jsonMode = args.includes('--json');
+
+ const opts = {};
+ if (runIdFlag) opts.run_id = runIdFlag.slice('--run='.length);
+ if (actionFlag) opts.action = actionFlag.slice('--action='.length);
+ if (lastFlag) opts.last = parseInt(lastFlag.slice('--last='.length), 10);
+ if (sinceFlag) opts.since = sinceFlag.slice('--since='.length);
+
+ if (jsonMode) {
+ const entries = readCallLog(opts);
+ console.log(JSON.stringify(entries, null, 2));
+ } else {
+ const summary = summarizeCallLog(opts);
+ console.log(`\n[Asset Call Log] ${getLogPath()}`);
+ console.log(` Total entries: ${summary.total_entries}`);
+ console.log(` Unique assets: ${summary.unique_assets}`);
+ console.log(` Unique runs: ${summary.unique_runs}`);
+ console.log(` By action:`);
+ for (const [action, count] of Object.entries(summary.by_action)) {
+ console.log(` ${action}: ${count}`);
+ }
+ if (summary.entries.length > 0) {
+ console.log(`\n Recent entries:`);
+ const show = summary.entries.slice(-10);
+ for (const e of show) {
+ const ts = e.timestamp ? e.timestamp.slice(0, 19) : '?';
+ const assetShort = e.asset_id ? e.asset_id.slice(0, 20) + '...' : '(none)';
+ const sigPreview = Array.isArray(e.signals) ? e.signals.slice(0, 3).join(', ') : '';
+ console.log(` [${ts}] ${e.action || '?'} asset=${assetShort} score=${e.score || '-'} mode=${e.mode || '-'} signals=[${sigPreview}] run=${e.run_id || '-'}`);
+ }
+ } else {
+ console.log('\n No entries found.');
+ }
+ console.log('');
+ }
+
} else {
- console.log(`Usage: node index.js [run|/evolve|solidify|distill] [--loop]
+ console.log(`Usage: node index.js [run|/evolve|solidify|distill|asset-log] [--loop]
- solidify flags:
- --dry-run
- --no-rollback
- --intent=repair|optimize|innovate
- --summary=...
- distill flags:
- - --response-file= (LLM response file for skill distillation)`);
+ - --response-file= (LLM response file for skill distillation)
+ - asset-log flags:
+ - --run= (filter by run ID)
+ - --action= (filter: hub_search_hit, hub_search_miss, asset_reuse, asset_reference, asset_publish, asset_publish_skip)
+ - --last= (show last N entries)
+ - --since= (entries after date)
+ - --json (raw JSON output)`);
}
}
diff --git a/skills/capability-evolver/package.json b/skills/capability-evolver/package.json
index 95030e3..6fdcdb3 100644
--- a/skills/capability-evolver/package.json
+++ b/skills/capability-evolver/package.json
@@ -1,6 +1,6 @@
{
"name": "evolver",
- "version": "1.20.4",
+ "version": "1.23.0",
"description": "A GEP-powered self-evolution engine for AI agents. Features automated log analysis and Genome Evolution Protocol (GEP) for auditable, reusable evolution assets.",
"main": "index.js",
"keywords": [
diff --git a/skills/capability-evolver/src/evolve.js b/skills/capability-evolver/src/evolve.js
index 79845ec..bf6b5ee 100644
--- a/skills/capability-evolver/src/evolve.js
+++ b/skills/capability-evolver/src/evolve.js
@@ -18,6 +18,7 @@ const {
const { selectGeneAndCapsule, matchPatternToSignals } = require('./gep/selector');
const { buildGepPrompt, buildReusePrompt, buildHubMatchedBlock } = require('./gep/prompt');
const { hubSearch } = require('./gep/hubSearch');
+const { logAssetCall } = require('./gep/assetCallLog');
const { extractCapabilityCandidates, renderCandidatesPreview } = require('./gep/candidates');
const memoryAdapter = require('./gep/memoryGraphAdapter');
const {
@@ -35,6 +36,8 @@ const { buildMutation, isHighRiskMutationAllowed } = require('./gep/mutation');
const { selectPersonalityForRun } = require('./gep/personality');
const { clip, writePromptArtifact, renderSessionsSpawnCall } = require('./gep/bridge');
const { getEvolutionDir } = require('./gep/paths');
+const { shouldReflect, buildReflectionContext, recordReflection } = require('./gep/reflection');
+const { loadNarrativeSummary } = require('./gep/narrativeMemory');
const REPO_ROOT = getRepoRoot();
@@ -744,6 +747,19 @@ async function run() {
delete process.env.FORCE_INNOVATION;
+ // SAFEGUARD: Git repository check.
+ // Solidify, rollback, and blast radius all depend on git. Without a git repo
+ // these operations silently produce empty results, leading to data loss.
+ try {
+ execSync('git rev-parse --git-dir', { cwd: REPO_ROOT, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], timeout: 5000 });
+ } catch (_) {
+ console.error('[Evolver] FATAL: Not a git repository (' + REPO_ROOT + ').');
+ console.error('[Evolver] Evolver requires git for rollback, blast radius calculation, and solidify.');
+ console.error('[Evolver] Run "git init && git add -A && git commit -m init" in your project root, then try again.');
+ process.exitCode = 1;
+ return;
+ }
+
var dormantHypothesis = readDormantHypothesis();
if (dormantHypothesis) {
console.log('[DormantHypothesis] Recovered partial state from previous backoff: ' + (dormantHypothesis.backoff_reason || 'unknown'));
@@ -1177,6 +1193,31 @@ async function run() {
throw new Error(`MemoryGraph Read failed: ${e.message}`);
}
+ // Reflection Phase: periodically pause to assess evolution strategy.
+ try {
+ const cycleState = fs.existsSync(STATE_FILE) ? JSON.parse(fs.readFileSync(STATE_FILE, 'utf8')) : {};
+ const cycleCount = cycleState.cycleCount || 0;
+ if (shouldReflect({ cycleCount, recentEvents })) {
+ const narrativeSummary = loadNarrativeSummary(3000);
+ const reflectionCtx = buildReflectionContext({
+ recentEvents,
+ signals,
+ memoryAdvice,
+ narrative: narrativeSummary,
+ });
+ recordReflection({
+ cycle_count: cycleCount,
+ signals_snapshot: signals.slice(0, 20),
+ preferred_gene: memoryAdvice && memoryAdvice.preferredGeneId ? memoryAdvice.preferredGeneId : null,
+ banned_genes: memoryAdvice && Array.isArray(memoryAdvice.bannedGeneIds) ? memoryAdvice.bannedGeneIds : [],
+ context_preview: reflectionCtx.slice(0, 1000),
+ });
+ console.log(`[Reflection] Strategic reflection recorded at cycle ${cycleCount}.`);
+ }
+ } catch (e) {
+ console.log('[Reflection] Failed (non-fatal): ' + (e && e.message ? e.message : e));
+ }
+
var recentFailedCapsules = [];
try {
recentFailedCapsules = readRecentFailedCapsules(50);
@@ -1370,6 +1411,25 @@ async function run() {
hub_lessons: hubLessons,
};
writeStateForSolidify(prevState);
+
+ if (hubHit && hubHit.hit) {
+ const assetAction = hubHit.mode === 'direct' ? 'asset_reuse' : 'asset_reference';
+ logAssetCall({
+ run_id: runId,
+ action: assetAction,
+ asset_id: hubHit.asset_id || null,
+ asset_type: hubHit.match && hubHit.match.type ? hubHit.match.type : null,
+ source_node_id: hubHit.source_node_id || null,
+ chain_id: hubHit.chain_id || null,
+ score: hubHit.score || null,
+ mode: hubHit.mode,
+ signals: Array.isArray(signals) ? signals : [],
+ extra: {
+ selected_gene_id: selectedGene && selectedGene.id ? selectedGene.id : null,
+ task_id: activeTask ? (activeTask.id || activeTask.task_id || null) : null,
+ },
+ });
+ }
} catch (e) {
console.error(`[SolidifyState] Write failed: ${e.message}`);
}
diff --git a/skills/capability-evolver/src/gep/a2a.js b/skills/capability-evolver/src/gep/a2a.js
index 2e34008..f47a7cf 100644
--- a/skills/capability-evolver/src/gep/a2a.js
+++ b/skills/capability-evolver/src/gep/a2a.js
@@ -28,8 +28,8 @@ function getBlastRadiusLimits() {
function isBlastRadiusSafe(blastRadius) {
var lim = getBlastRadiusLimits();
- var files = blastRadius && Number.isFinite(Number(blastRadius.files)) ? Number(blastRadius.files) : 0;
- var lines = blastRadius && Number.isFinite(Number(blastRadius.lines)) ? Number(blastRadius.lines) : 0;
+ var files = blastRadius && Number.isFinite(Number(blastRadius.files)) ? Math.max(0, Number(blastRadius.files)) : 0;
+ var lines = blastRadius && Number.isFinite(Number(blastRadius.lines)) ? Math.max(0, Number(blastRadius.lines)) : 0;
return files <= lim.maxFiles && lines <= lim.maxLines;
}
diff --git a/skills/capability-evolver/src/gep/a2aProtocol.js b/skills/capability-evolver/src/gep/a2aProtocol.js
index d3695ff..83fa946 100644
--- a/skills/capability-evolver/src/gep/a2aProtocol.js
+++ b/skills/capability-evolver/src/gep/a2aProtocol.js
@@ -96,6 +96,9 @@ function getNodeId() {
// --- Base message builder ---
function buildMessage(params) {
+ if (!params || typeof params !== 'object') {
+ throw new Error('buildMessage requires a params object');
+ }
var messageType = params.messageType;
var payload = params.payload;
var senderId = params.senderId;
@@ -197,14 +200,18 @@ function buildPublishBundle(opts) {
function buildFetch(opts) {
var o = opts || {};
+ var fetchPayload = {
+ asset_type: o.assetType || null,
+ local_id: o.localId || null,
+ content_hash: o.contentHash || null,
+ };
+ if (Array.isArray(o.signals) && o.signals.length > 0) {
+ fetchPayload.signals = o.signals;
+ }
return buildMessage({
messageType: 'fetch',
senderId: o.nodeId,
- payload: {
- asset_type: o.assetType || null,
- local_id: o.localId || null,
- content_hash: o.contentHash || null,
- },
+ payload: fetchPayload,
});
}
@@ -351,7 +358,8 @@ function httpTransportReceive(opts) {
var hubUrl = (opts && opts.hubUrl) || process.env.A2A_HUB_URL;
if (!hubUrl) return Promise.resolve([]);
var assetType = (opts && opts.assetType) || null;
- var fetchMsg = buildFetch({ assetType: assetType });
+ var signals = (opts && Array.isArray(opts.signals)) ? opts.signals : null;
+ var fetchMsg = buildFetch({ assetType: assetType, signals: signals });
var endpoint = hubUrl.replace(/\/+$/, '') + '/a2a/fetch';
return fetch(endpoint, {
method: 'POST',
diff --git a/skills/capability-evolver/src/gep/assetCallLog.js b/skills/capability-evolver/src/gep/assetCallLog.js
new file mode 100644
index 0000000..b28c97a
--- /dev/null
+++ b/skills/capability-evolver/src/gep/assetCallLog.js
@@ -0,0 +1,130 @@
+// Append-only asset call log for tracking Hub asset interactions per evolution run.
+// Log file: {evolution_dir}/asset_call_log.jsonl
+
+const fs = require('fs');
+const path = require('path');
+const { getEvolutionDir } = require('./paths');
+
+function getLogPath() {
+ return path.join(getEvolutionDir(), 'asset_call_log.jsonl');
+}
+
+function ensureDir(filePath) {
+ const dir = path.dirname(filePath);
+ if (!fs.existsSync(dir)) {
+ fs.mkdirSync(dir, { recursive: true });
+ }
+}
+
+/**
+ * Append a single asset call record to the log.
+ *
+ * @param {object} entry
+ * @param {string} entry.run_id
+ * @param {string} entry.action - hub_search_hit | hub_search_miss | asset_reuse | asset_reference | asset_publish | asset_publish_skip
+ * @param {string} [entry.asset_id]
+ * @param {string} [entry.asset_type]
+ * @param {string} [entry.source_node_id]
+ * @param {string} [entry.chain_id]
+ * @param {number} [entry.score]
+ * @param {string} [entry.mode] - direct | reference
+ * @param {string[]} [entry.signals]
+ * @param {string} [entry.reason]
+ * @param {object} [entry.extra]
+ */
+function logAssetCall(entry) {
+ if (!entry || typeof entry !== 'object') return;
+ try {
+ const logPath = getLogPath();
+ ensureDir(logPath);
+ const record = {
+ timestamp: new Date().toISOString(),
+ ...entry,
+ };
+ fs.appendFileSync(logPath, JSON.stringify(record) + '\n', 'utf8');
+ } catch (e) {
+ // Non-fatal: never block evolution for logging failure
+ }
+}
+
+/**
+ * Read asset call log entries with optional filters.
+ *
+ * @param {object} [opts]
+ * @param {string} [opts.run_id] - filter by run_id
+ * @param {string} [opts.action] - filter by action type
+ * @param {number} [opts.last] - only return last N entries
+ * @param {string} [opts.since] - ISO date string, only entries after this time
+ * @returns {object[]}
+ */
+function readCallLog(opts) {
+ const o = opts || {};
+ const logPath = getLogPath();
+ if (!fs.existsSync(logPath)) return [];
+
+ const raw = fs.readFileSync(logPath, 'utf8');
+ const lines = raw.split('\n').filter(Boolean);
+
+ let entries = [];
+ for (const line of lines) {
+ try {
+ entries.push(JSON.parse(line));
+ } catch (e) { /* skip corrupt lines */ }
+ }
+
+ if (o.since) {
+ const sinceTs = new Date(o.since).getTime();
+ if (Number.isFinite(sinceTs)) {
+ entries = entries.filter(e => new Date(e.timestamp).getTime() >= sinceTs);
+ }
+ }
+
+ if (o.run_id) {
+ entries = entries.filter(e => e.run_id === o.run_id);
+ }
+
+ if (o.action) {
+ entries = entries.filter(e => e.action === o.action);
+ }
+
+ if (o.last && Number.isFinite(o.last) && o.last > 0) {
+ entries = entries.slice(-o.last);
+ }
+
+ return entries;
+}
+
+/**
+ * Summarize asset call log (for CLI display).
+ *
+ * @param {object} [opts] - same filters as readCallLog
+ * @returns {object} summary with totals and per-action counts
+ */
+function summarizeCallLog(opts) {
+ const entries = readCallLog(opts);
+ const actionCounts = {};
+ const assetsSeen = new Set();
+ const runsSeen = new Set();
+
+ for (const e of entries) {
+ const a = e.action || 'unknown';
+ actionCounts[a] = (actionCounts[a] || 0) + 1;
+ if (e.asset_id) assetsSeen.add(e.asset_id);
+ if (e.run_id) runsSeen.add(e.run_id);
+ }
+
+ return {
+ total_entries: entries.length,
+ unique_assets: assetsSeen.size,
+ unique_runs: runsSeen.size,
+ by_action: actionCounts,
+ entries,
+ };
+}
+
+module.exports = {
+ logAssetCall,
+ readCallLog,
+ summarizeCallLog,
+ getLogPath,
+};
diff --git a/skills/capability-evolver/src/gep/hubSearch.js b/skills/capability-evolver/src/gep/hubSearch.js
index c70e749..deb568a 100644
--- a/skills/capability-evolver/src/gep/hubSearch.js
+++ b/skills/capability-evolver/src/gep/hubSearch.js
@@ -2,11 +2,17 @@
//
// Flow: extractSignals() -> hubSearch(signals) -> if hit: reuse; if miss: normal evolve
// Two modes: direct (skip local reasoning) | reference (inject into prompt as strong hint)
+//
+// Uses POST /a2a/fetch with signals field (protocol-native) instead of GET /a2a/assets/search.
+// This returns full payload (content, diff, strategy) in a single round-trip.
-const { getNodeId } = require('./a2aProtocol');
+const { getNodeId, buildFetch } = require('./a2aProtocol');
+const { logAssetCall } = require('./assetCallLog');
const DEFAULT_MIN_REUSE_SCORE = 0.72;
const DEFAULT_REUSE_MODE = 'reference'; // 'direct' | 'reference'
+const MAX_STREAK_CAP = 5;
+const TIMEOUT_REASON = 'hub_search_timeout';
function getHubUrl() {
return (process.env.A2A_HUB_URL || '').replace(/\/+$/, '');
@@ -24,13 +30,14 @@ function getMinReuseScore() {
/**
* Score a hub asset for local reuse quality.
- * rank = confidence * max(success_streak, 1) * (reputation / 100)
+ * rank = confidence * min(max(success_streak, 1), MAX_STREAK_CAP) * (reputation / 100)
+ * Streak is capped to prevent unbounded score inflation.
*/
function scoreHubResult(asset) {
const confidence = Number(asset.confidence) || 0;
- const streak = Math.max(Number(asset.success_streak) || 0, 1);
- // Reputation is included in asset from hub ranked endpoint; default 50 if missing
- const reputation = Number(asset.reputation_score) || 50;
+ const streak = Math.min(Math.max(Number(asset.success_streak) || 0, 1), MAX_STREAK_CAP);
+ const repRaw = Number(asset.reputation_score);
+ const reputation = Number.isFinite(repRaw) ? repRaw : 50;
return confidence * streak * (reputation / 100);
}
@@ -45,7 +52,6 @@ function pickBestMatch(results, threshold) {
let bestScore = 0;
for (const asset of results) {
- // Only consider promoted assets
if (asset.status && asset.status !== 'promoted') continue;
const s = scoreHubResult(asset);
if (s > bestScore) {
@@ -64,48 +70,96 @@ function pickBestMatch(results, threshold) {
}
/**
- * Search the hub for reusable capsules matching the given signals.
+ * Search the hub for reusable assets matching the given signals.
+ * Uses POST /a2a/fetch with signals (protocol-native, returns full payload).
+ * Falls back to GET /a2a/assets/search if fetch fails.
* Returns { hit: true, match, score, mode } or { hit: false }.
*/
async function hubSearch(signals, opts) {
const hubUrl = getHubUrl();
if (!hubUrl) return { hit: false, reason: 'no_hub_url' };
- const signalList = Array.isArray(signals) ? signals.filter(Boolean) : [];
+ const signalList = Array.isArray(signals)
+ ? signals.map(s => typeof s === 'string' ? s.trim() : '').filter(Boolean)
+ : [];
if (signalList.length === 0) return { hit: false, reason: 'no_signals' };
const threshold = (opts && Number.isFinite(opts.threshold)) ? opts.threshold : getMinReuseScore();
- const limit = (opts && Number.isFinite(opts.limit)) ? opts.limit : 5;
const timeout = (opts && Number.isFinite(opts.timeoutMs)) ? opts.timeoutMs : 8000;
try {
- const params = new URLSearchParams();
- params.set('signals', signalList.join(','));
- params.set('status', 'promoted');
- params.set('limit', String(limit));
+ const fetchMsg = buildFetch({ signals: signalList });
+ const endpoint = hubUrl + '/a2a/fetch';
const controller = new AbortController();
- const timer = setTimeout(() => controller.abort(), timeout);
+ const timer = setTimeout(() => controller.abort(TIMEOUT_REASON), timeout);
- const url = `${hubUrl}/a2a/assets/search?${params.toString()}`;
- const res = await fetch(url, {
- method: 'GET',
- headers: { 'Content-Type': 'application/json' },
+ const headers = { 'Content-Type': 'application/json', 'Accept': 'application/json' };
+ const token = process.env.A2A_HUB_TOKEN;
+ if (token) headers['Authorization'] = `Bearer ${token}`;
+
+ const res = await fetch(endpoint, {
+ method: 'POST',
+ headers,
+ body: JSON.stringify(fetchMsg),
signal: controller.signal,
});
clearTimeout(timer);
- if (!res.ok) return { hit: false, reason: `hub_http_${res.status}` };
+ if (!res.ok) {
+ logAssetCall({
+ run_id: (opts && opts.run_id) || null,
+ action: 'hub_search_miss',
+ signals: signalList,
+ reason: `hub_http_${res.status}`,
+ via: 'fetch_with_signals',
+ });
+ return { hit: false, reason: `hub_http_${res.status}` };
+ }
const data = await res.json();
- const assets = Array.isArray(data.assets) ? data.assets : [];
+ const results = (data && data.payload && Array.isArray(data.payload.results))
+ ? data.payload.results
+ : [];
- if (assets.length === 0) return { hit: false, reason: 'no_results' };
+ if (results.length === 0) {
+ logAssetCall({
+ run_id: (opts && opts.run_id) || null,
+ action: 'hub_search_miss',
+ signals: signalList,
+ reason: 'no_results',
+ via: 'fetch_with_signals',
+ });
+ return { hit: false, reason: 'no_results' };
+ }
- const pick = pickBestMatch(assets, threshold);
- if (!pick) return { hit: false, reason: 'below_threshold', candidates: assets.length };
+ const pick = pickBestMatch(results, threshold);
+ if (!pick) {
+ logAssetCall({
+ run_id: (opts && opts.run_id) || null,
+ action: 'hub_search_miss',
+ signals: signalList,
+ reason: 'below_threshold',
+ extra: { candidates: results.length, threshold },
+ via: 'fetch_with_signals',
+ });
+ return { hit: false, reason: 'below_threshold', candidates: results.length };
+ }
- console.log(`[HubSearch] Hit: ${pick.match.asset_id || pick.match.local_id} (score=${pick.score}, mode=${pick.mode})`);
+ console.log(`[HubSearch] Hit via fetch+signals: ${pick.match.asset_id || 'unknown'} (score=${pick.score}, mode=${pick.mode})`);
+
+ logAssetCall({
+ run_id: (opts && opts.run_id) || null,
+ action: 'hub_search_hit',
+ asset_id: pick.match.asset_id || null,
+ asset_type: pick.match.asset_type || pick.match.type || null,
+ source_node_id: pick.match.source_node_id || null,
+ chain_id: pick.match.chain_id || null,
+ score: pick.score,
+ mode: pick.mode,
+ signals: signalList,
+ via: 'fetch_with_signals',
+ });
return {
hit: true,
@@ -117,9 +171,18 @@ async function hubSearch(signals, opts) {
chain_id: pick.match.chain_id || null,
};
} catch (err) {
- // Hub unreachable is non-fatal; fall through to normal evolve
- console.log(`[HubSearch] Failed (non-fatal): ${err.message}`);
- return { hit: false, reason: 'fetch_error', error: err.message };
+ const isTimeout = err.name === 'AbortError' || (err.cause && err.cause === TIMEOUT_REASON);
+ const reason = isTimeout ? 'timeout' : 'fetch_error';
+ console.log(`[HubSearch] Failed (non-fatal, ${reason}): ${err.message}`);
+ logAssetCall({
+ run_id: (opts && opts.run_id) || null,
+ action: 'hub_search_miss',
+ signals: signalList,
+ reason,
+ extra: { error: err.message },
+ via: 'fetch_with_signals',
+ });
+ return { hit: false, reason, error: err.message };
}
}
diff --git a/skills/capability-evolver/src/gep/llmReview.js b/skills/capability-evolver/src/gep/llmReview.js
new file mode 100644
index 0000000..d49aa6a
--- /dev/null
+++ b/skills/capability-evolver/src/gep/llmReview.js
@@ -0,0 +1,86 @@
+'use strict';
+
+const { execSync } = require('child_process');
+const { getRepoRoot } = require('./paths');
+
+const REVIEW_ENABLED_KEY = 'EVOLVER_LLM_REVIEW';
+const REVIEW_TIMEOUT_MS = 30000;
+
+function isLlmReviewEnabled() {
+ return String(process.env[REVIEW_ENABLED_KEY] || '').toLowerCase() === 'true';
+}
+
+function buildReviewPrompt({ diff, gene, signals, mutation }) {
+ const geneId = gene && gene.id ? gene.id : '(unknown)';
+ const category = (mutation && mutation.category) || (gene && gene.category) || 'unknown';
+ const rationale = mutation && mutation.rationale ? String(mutation.rationale).slice(0, 500) : '(none)';
+ const signalsList = Array.isArray(signals) ? signals.slice(0, 8).join(', ') : '(none)';
+ const diffPreview = String(diff || '').slice(0, 6000);
+
+ return `You are reviewing a code change produced by an autonomous evolution engine.
+
+## Context
+- Gene: ${geneId} (${category})
+- Signals: [${signalsList}]
+- Rationale: ${rationale}
+
+## Diff
+\`\`\`diff
+${diffPreview}
+\`\`\`
+
+## Review Criteria
+1. Does this change address the stated signals?
+2. Are there any obvious regressions or bugs introduced?
+3. Is the blast radius proportionate to the problem?
+4. Are there any security or safety concerns?
+
+## Response Format
+Respond with a JSON object:
+{
+ "approved": true|false,
+ "confidence": 0.0-1.0,
+ "concerns": ["..."],
+ "summary": "one-line review summary"
+}`;
+}
+
+function runLlmReview({ diff, gene, signals, mutation }) {
+ if (!isLlmReviewEnabled()) return null;
+
+ const prompt = buildReviewPrompt({ diff, gene, signals, mutation });
+
+ try {
+ const repoRoot = getRepoRoot();
+ const escapedPrompt = prompt.replace(/'/g, "'\\''");
+ const result = execSync(
+ `echo '${escapedPrompt}' | node -e "
+ const readline = require('readline');
+ const rl = readline.createInterface({ input: process.stdin });
+ let input = '';
+ rl.on('line', l => input += l + '\\n');
+ rl.on('close', () => {
+ console.log(JSON.stringify({ approved: true, confidence: 0.7, concerns: [], summary: 'auto-approved (no external LLM configured)' }));
+ });
+ "`,
+ {
+ cwd: repoRoot,
+ encoding: 'utf8',
+ timeout: REVIEW_TIMEOUT_MS,
+ stdio: ['pipe', 'pipe', 'pipe'],
+ windowsHide: true,
+ }
+ );
+
+ try {
+ return JSON.parse(result.trim());
+ } catch (_) {
+ return { approved: true, confidence: 0.5, concerns: ['failed to parse review response'], summary: 'review parse error' };
+ }
+ } catch (e) {
+ console.log('[LLMReview] Execution failed (non-fatal): ' + (e && e.message ? e.message : e));
+ return { approved: true, confidence: 0.5, concerns: ['review execution failed'], summary: 'review timeout or error' };
+ }
+}
+
+module.exports = { isLlmReviewEnabled, runLlmReview, buildReviewPrompt };
diff --git a/skills/capability-evolver/src/gep/narrativeMemory.js b/skills/capability-evolver/src/gep/narrativeMemory.js
new file mode 100644
index 0000000..fae8854
--- /dev/null
+++ b/skills/capability-evolver/src/gep/narrativeMemory.js
@@ -0,0 +1,108 @@
+'use strict';
+
+const fs = require('fs');
+const path = require('path');
+const { getNarrativePath, getEvolutionDir } = require('./paths');
+
+const MAX_NARRATIVE_ENTRIES = 30;
+const MAX_NARRATIVE_SIZE = 12000;
+
+function ensureDir(dir) {
+ try { if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); } catch (_) {}
+}
+
+function recordNarrative({ gene, signals, mutation, outcome, blast, capsule }) {
+ const narrativePath = getNarrativePath();
+ ensureDir(path.dirname(narrativePath));
+
+ const ts = new Date().toISOString().replace('T', ' ').slice(0, 19);
+ const geneId = gene && gene.id ? gene.id : '(auto)';
+ const category = (mutation && mutation.category) || (gene && gene.category) || 'unknown';
+ const status = outcome && outcome.status ? outcome.status : 'unknown';
+ const score = outcome && typeof outcome.score === 'number' ? outcome.score.toFixed(2) : '?';
+ const signalsSummary = Array.isArray(signals) ? signals.slice(0, 4).join(', ') : '(none)';
+ const filesChanged = blast ? blast.files : 0;
+ const linesChanged = blast ? blast.lines : 0;
+ const rationale = mutation && mutation.rationale
+ ? String(mutation.rationale).slice(0, 200) : '';
+ const strategy = gene && Array.isArray(gene.strategy)
+ ? gene.strategy.slice(0, 3).map((s, i) => ` ${i + 1}. ${s}`).join('\n') : '';
+ const capsuleSummary = capsule && capsule.summary ? String(capsule.summary).slice(0, 200) : '';
+
+ const entry = [
+ `### [${ts}] ${category.toUpperCase()} - ${status}`,
+ `- Gene: ${geneId} | Score: ${score} | Scope: ${filesChanged} files, ${linesChanged} lines`,
+ `- Signals: [${signalsSummary}]`,
+ rationale ? `- Why: ${rationale}` : null,
+ strategy ? `- Strategy:\n${strategy}` : null,
+ capsuleSummary ? `- Result: ${capsuleSummary}` : null,
+ '',
+ ].filter(line => line !== null).join('\n');
+
+ let existing = '';
+ try {
+ if (fs.existsSync(narrativePath)) {
+ existing = fs.readFileSync(narrativePath, 'utf8');
+ }
+ } catch (_) {}
+
+ if (!existing.trim()) {
+ existing = '# Evolution Narrative\n\nA chronological record of evolution decisions and outcomes.\n\n';
+ }
+
+ const combined = existing + entry;
+ const trimmed = trimNarrative(combined);
+
+ const tmp = narrativePath + '.tmp';
+ fs.writeFileSync(tmp, trimmed, 'utf8');
+ fs.renameSync(tmp, narrativePath);
+}
+
+function trimNarrative(content) {
+ if (content.length <= MAX_NARRATIVE_SIZE) return content;
+
+ const headerEnd = content.indexOf('###');
+ if (headerEnd < 0) return content.slice(-MAX_NARRATIVE_SIZE);
+
+ const header = content.slice(0, headerEnd);
+ const entries = content.slice(headerEnd).split(/(?=^### \[)/m);
+
+ while (entries.length > MAX_NARRATIVE_ENTRIES) {
+ entries.shift();
+ }
+
+ let result = header + entries.join('');
+ if (result.length > MAX_NARRATIVE_SIZE) {
+ const keep = Math.max(1, entries.length - 5);
+ result = header + entries.slice(-keep).join('');
+ }
+
+ return result;
+}
+
+function loadNarrativeSummary(maxChars) {
+ const limit = Number.isFinite(maxChars) ? maxChars : 4000;
+ const narrativePath = getNarrativePath();
+ try {
+ if (!fs.existsSync(narrativePath)) return '';
+ const content = fs.readFileSync(narrativePath, 'utf8');
+ if (!content.trim()) return '';
+
+ const headerEnd = content.indexOf('###');
+ if (headerEnd < 0) return '';
+
+ const entries = content.slice(headerEnd).split(/(?=^### \[)/m);
+ const recent = entries.slice(-8);
+ let summary = recent.join('');
+ if (summary.length > limit) {
+ summary = summary.slice(-limit);
+ const firstEntry = summary.indexOf('### [');
+ if (firstEntry > 0) summary = summary.slice(firstEntry);
+ }
+ return summary.trim();
+ } catch (_) {
+ return '';
+ }
+}
+
+module.exports = { recordNarrative, loadNarrativeSummary, trimNarrative };
diff --git a/skills/capability-evolver/src/gep/paths.js b/skills/capability-evolver/src/gep/paths.js
index 01218dd..9fba0a4 100644
--- a/skills/capability-evolver/src/gep/paths.js
+++ b/skills/capability-evolver/src/gep/paths.js
@@ -28,7 +28,8 @@ function getSessionScope() {
if (!raw) return null;
// Sanitize: only allow alphanumeric, dash, underscore, dot (prevent path traversal).
const safe = raw.replace(/[^a-zA-Z0-9_\-\.]/g, '_').slice(0, 128);
- return safe || null;
+ if (!safe || /^\.{1,2}$/.test(safe) || /\.\./.test(safe)) return null;
+ return safe;
}
function getEvolutionDir() {
@@ -54,6 +55,21 @@ function getSkillsDir() {
return process.env.SKILLS_DIR || path.join(getWorkspaceRoot(), 'skills');
}
+function getNarrativePath() {
+ return path.join(getEvolutionDir(), 'evolution_narrative.md');
+}
+
+function getEvolutionPrinciplesPath() {
+ const repoRoot = getRepoRoot();
+ const custom = path.join(repoRoot, 'EVOLUTION_PRINCIPLES.md');
+ if (require('fs').existsSync(custom)) return custom;
+ return path.join(repoRoot, 'assets', 'gep', 'EVOLUTION_PRINCIPLES.md');
+}
+
+function getReflectionLogPath() {
+ return path.join(getEvolutionDir(), 'reflection_log.jsonl');
+}
+
module.exports = {
getRepoRoot,
getWorkspaceRoot,
@@ -63,5 +79,8 @@ module.exports = {
getGepAssetsDir,
getSkillsDir,
getSessionScope,
+ getNarrativePath,
+ getEvolutionPrinciplesPath,
+ getReflectionLogPath,
};
diff --git a/skills/capability-evolver/src/gep/prompt.js b/skills/capability-evolver/src/gep/prompt.js
index fccb639..2dbe9f0 100644
--- a/skills/capability-evolver/src/gep/prompt.js
+++ b/skills/capability-evolver/src/gep/prompt.js
@@ -1,7 +1,10 @@
+const fs = require('fs');
const { captureEnvFingerprint } = require('./envFingerprint');
const { formatAssetPreview } = require('./assets');
-const { generateInnovationIdeas } = require('../ops/innovation'); // [2026-02-14] Innovation Catalyst Integration
-const { analyzeRecentHistory, OPPORTUNITY_SIGNALS } = require('./signals'); // [2026-02-14] Signal Analysis Integration
+const { generateInnovationIdeas } = require('../ops/innovation');
+const { analyzeRecentHistory, OPPORTUNITY_SIGNALS } = require('./signals');
+const { loadNarrativeSummary } = require('./narrativeMemory');
+const { getEvolutionPrinciplesPath } = require('./paths');
/**
* Build a minimal prompt for direct-reuse mode.
@@ -219,6 +222,29 @@ function buildLessonsBlock(hubLessons, signals) {
return parts.join('\n');
}
+function buildNarrativeBlock() {
+ try {
+ const narrative = loadNarrativeSummary(3000);
+ if (!narrative) return '';
+ return `\nContext [Evolution Narrative] (Recent decisions and outcomes -- learn from this history):\n${narrative}\n`;
+ } catch (_) {
+ return '';
+ }
+}
+
+function buildPrinciplesBlock() {
+ try {
+ const principlesPath = getEvolutionPrinciplesPath();
+ if (!fs.existsSync(principlesPath)) return '';
+ const content = fs.readFileSync(principlesPath, 'utf8');
+ if (!content.trim()) return '';
+ const trimmed = content.length > 2000 ? content.slice(0, 2000) + '\n...[TRUNCATED]' : content;
+ return `\nContext [Evolution Principles] (Guiding directives -- align your actions):\n${trimmed}\n`;
+ } catch (_) {
+ return '';
+ }
+}
+
function buildGepPrompt({
nowIso,
context,
@@ -485,7 +511,8 @@ Context [External Candidates]:
${externalCandidatesPreview || '(none)'}
${buildAntiPatternZone(failedCapsules, signals)}${buildLessonsBlock(hubLessons, signals)}
${historyBlock}
-
+${buildNarrativeBlock()}
+${buildPrinciplesBlock()}
Context [Execution]:
${executionContext}
@@ -536,4 +563,4 @@ Rules:
return basePrompt.slice(0, maxChars) + "\n...[TRUNCATED]...";
}
-module.exports = { buildGepPrompt, buildReusePrompt, buildHubMatchedBlock, buildLessonsBlock };
+module.exports = { buildGepPrompt, buildReusePrompt, buildHubMatchedBlock, buildLessonsBlock, buildNarrativeBlock, buildPrinciplesBlock };
diff --git a/skills/capability-evolver/src/gep/reflection.js b/skills/capability-evolver/src/gep/reflection.js
new file mode 100644
index 0000000..fac1aff
--- /dev/null
+++ b/skills/capability-evolver/src/gep/reflection.js
@@ -0,0 +1,127 @@
+'use strict';
+
+const fs = require('fs');
+const path = require('path');
+const { getReflectionLogPath, getEvolutionDir } = require('./paths');
+
+const REFLECTION_INTERVAL_CYCLES = 5;
+const REFLECTION_COOLDOWN_MS = 30 * 60 * 1000;
+
+function ensureDir(dir) {
+ try { if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); } catch (_) {}
+}
+
+function shouldReflect({ cycleCount, recentEvents }) {
+ if (!Number.isFinite(cycleCount) || cycleCount < REFLECTION_INTERVAL_CYCLES) return false;
+ if (cycleCount % REFLECTION_INTERVAL_CYCLES !== 0) return false;
+
+ const logPath = getReflectionLogPath();
+ try {
+ if (fs.existsSync(logPath)) {
+ const stat = fs.statSync(logPath);
+ if (Date.now() - stat.mtimeMs < REFLECTION_COOLDOWN_MS) return false;
+ }
+ } catch (_) {}
+
+ return true;
+}
+
+function buildReflectionContext({ recentEvents, signals, memoryAdvice, narrative }) {
+ const parts = ['You are performing a strategic reflection on recent evolution cycles.'];
+ parts.push('Analyze the patterns below and provide concise strategic guidance.');
+ parts.push('');
+
+ if (Array.isArray(recentEvents) && recentEvents.length > 0) {
+ const last10 = recentEvents.slice(-10);
+ const successCount = last10.filter(e => e && e.outcome && e.outcome.status === 'success').length;
+ const failCount = last10.filter(e => e && e.outcome && e.outcome.status === 'failed').length;
+ const intents = {};
+ last10.forEach(e => {
+ const i = e && e.intent ? e.intent : 'unknown';
+ intents[i] = (intents[i] || 0) + 1;
+ });
+ const genes = {};
+ last10.forEach(e => {
+ const g = e && Array.isArray(e.genes_used) && e.genes_used[0] ? e.genes_used[0] : 'unknown';
+ genes[g] = (genes[g] || 0) + 1;
+ });
+
+ parts.push('## Recent Cycle Statistics (last 10)');
+ parts.push(`- Success: ${successCount}, Failed: ${failCount}`);
+ parts.push(`- Intent distribution: ${JSON.stringify(intents)}`);
+ parts.push(`- Gene usage: ${JSON.stringify(genes)}`);
+ parts.push('');
+ }
+
+ if (Array.isArray(signals) && signals.length > 0) {
+ parts.push('## Current Signals');
+ parts.push(signals.slice(0, 20).join(', '));
+ parts.push('');
+ }
+
+ if (memoryAdvice) {
+ parts.push('## Memory Graph Advice');
+ if (memoryAdvice.preferredGeneId) {
+ parts.push(`- Preferred gene: ${memoryAdvice.preferredGeneId}`);
+ }
+ if (Array.isArray(memoryAdvice.bannedGeneIds) && memoryAdvice.bannedGeneIds.length > 0) {
+ parts.push(`- Banned genes: ${memoryAdvice.bannedGeneIds.join(', ')}`);
+ }
+ if (memoryAdvice.explanation) {
+ parts.push(`- Explanation: ${memoryAdvice.explanation}`);
+ }
+ parts.push('');
+ }
+
+ if (narrative) {
+ parts.push('## Recent Evolution Narrative');
+ parts.push(String(narrative).slice(0, 3000));
+ parts.push('');
+ }
+
+ parts.push('## Questions to Answer');
+ parts.push('1. Are there persistent signals being ignored?');
+ parts.push('2. Is the gene selection strategy optimal, or are we stuck in a local maximum?');
+ parts.push('3. Should the balance between repair/optimize/innovate shift?');
+ parts.push('4. Are there capability gaps that no current gene addresses?');
+ parts.push('5. What single strategic adjustment would have the highest impact?');
+ parts.push('');
+ parts.push('Respond with a JSON object: { "insights": [...], "strategy_adjustment": "...", "priority_signals": [...] }');
+
+ return parts.join('\n');
+}
+
+function recordReflection(reflection) {
+ const logPath = getReflectionLogPath();
+ ensureDir(path.dirname(logPath));
+
+ const entry = JSON.stringify({
+ ts: new Date().toISOString(),
+ type: 'reflection',
+ ...reflection,
+ }) + '\n';
+
+ fs.appendFileSync(logPath, entry, 'utf8');
+}
+
+function loadRecentReflections(count) {
+ const n = Number.isFinite(count) ? count : 3;
+ const logPath = getReflectionLogPath();
+ try {
+ if (!fs.existsSync(logPath)) return [];
+ const lines = fs.readFileSync(logPath, 'utf8').trim().split('\n').filter(Boolean);
+ return lines.slice(-n).map(line => {
+ try { return JSON.parse(line); } catch (_) { return null; }
+ }).filter(Boolean);
+ } catch (_) {
+ return [];
+ }
+}
+
+module.exports = {
+ shouldReflect,
+ buildReflectionContext,
+ recordReflection,
+ loadRecentReflections,
+ REFLECTION_INTERVAL_CYCLES,
+};
diff --git a/skills/capability-evolver/src/gep/selector.js b/skills/capability-evolver/src/gep/selector.js
index d218f79..b29886c 100644
--- a/skills/capability-evolver/src/gep/selector.js
+++ b/skills/capability-evolver/src/gep/selector.js
@@ -3,6 +3,7 @@ function matchPatternToSignals(pattern, signals) {
const p = String(pattern);
const sig = signals.map(s => String(s));
+ // Regex pattern: /body/flags
const regexLike = p.length >= 2 && p.startsWith('/') && p.lastIndexOf('/') > 0;
if (regexLike) {
const lastSlash = p.lastIndexOf('/');
@@ -16,6 +17,12 @@ function matchPatternToSignals(pattern, signals) {
}
}
+ // Multi-language alias: "en_term|zh_term|ja_term" -- any branch matching = hit
+ if (p.includes('|') && !p.startsWith('/')) {
+ const branches = p.split('|').map(b => b.trim().toLowerCase()).filter(Boolean);
+ return branches.some(needle => sig.some(s => s.toLowerCase().includes(needle)));
+ }
+
const needle = p.toLowerCase();
return sig.some(s => s.toLowerCase().includes(needle));
}
@@ -67,6 +74,7 @@ function computeDriftIntensity(opts) {
}
function selectGene(genes, signals, opts) {
+ const genesList = Array.isArray(genes) ? genes : [];
const bannedGeneIds = opts && opts.bannedGeneIds ? opts.bannedGeneIds : new Set();
const driftEnabled = !!(opts && opts.driftEnabled);
const preferredGeneId = opts && typeof opts.preferredGeneId === 'string' ? opts.preferredGeneId : null;
@@ -75,14 +83,14 @@ function selectGene(genes, signals, opts) {
var driftIntensity = computeDriftIntensity({
driftEnabled: driftEnabled,
effectivePopulationSize: opts && opts.effectivePopulationSize,
- genePoolSize: genes ? genes.length : 0,
+ genePoolSize: genesList.length,
});
var useDrift = driftEnabled || driftIntensity > 0.15;
var DISTILLED_PREFIX = 'gene_distilled_';
var DISTILLED_SCORE_FACTOR = 0.8;
- const scored = genes
+ const scored = genesList
.map(g => {
var s = scoreGene(g, signals);
if (s > 0 && g.id && String(g.id).startsWith(DISTILLED_PREFIX)) s *= DISTILLED_SCORE_FACTOR;
diff --git a/skills/capability-evolver/src/gep/signals.js b/skills/capability-evolver/src/gep/signals.js
index 0df85bd..95268d6 100644
--- a/skills/capability-evolver/src/gep/signals.js
+++ b/skills/capability-evolver/src/gep/signals.js
@@ -282,14 +282,14 @@ function extractSignals({ recentSessionTranscript, todayLog, memorySnippet, user
// --- Tool Usage Analytics ---
var toolUsage = {};
- var toolMatches = corpus.match(/\[TOOL:\s*(\w+)\]/g) || [];
+ var toolMatches = corpus.match(/\[TOOL:\s*([\w-]+)\]/g) || [];
// Extract exec commands to identify benign loops (like watchdog checks)
var execCommands = corpus.match(/exec: (node\s+[\w\/\.-]+\.js\s+ensure)/g) || [];
var benignExecCount = execCommands.length;
for (var i = 0; i < toolMatches.length; i++) {
- var toolName = toolMatches[i].match(/\[TOOL:\s*(\w+)\]/)[1];
+ var toolName = toolMatches[i].match(/\[TOOL:\s*([\w-]+)\]/)[1];
toolUsage[toolName] = (toolUsage[toolName] || 0) + 1;
}
diff --git a/skills/capability-evolver/src/gep/skillDistiller.js b/skills/capability-evolver/src/gep/skillDistiller.js
index 7f5b575..be704a3 100644
--- a/skills/capability-evolver/src/gep/skillDistiller.js
+++ b/skills/capability-evolver/src/gep/skillDistiller.js
@@ -223,7 +223,7 @@ function buildDistillationPrompt(analysis, existingGenes, sampleCapsules) {
});
return [
- 'You are a Gene synthesis engine for the GEP (Gene Expression Protocol).',
+ 'You are a Gene synthesis engine for the GEP (Genome Evolution Protocol).',
'',
'Analyze the following successful evolution capsules and extract a reusable Gene.',
'',
diff --git a/skills/capability-evolver/src/gep/solidify.js b/skills/capability-evolver/src/gep/solidify.js
index 1b9f9da..1b95054 100644
--- a/skills/capability-evolver/src/gep/solidify.js
+++ b/skills/capability-evolver/src/gep/solidify.js
@@ -17,6 +17,9 @@ const {
const { computeAssetId, SCHEMA_VERSION } = require('./contentHash');
const { captureEnvFingerprint } = require('./envFingerprint');
const { buildValidationReport } = require('./validationReport');
+const { logAssetCall } = require('./assetCallLog');
+const { recordNarrative } = require('./narrativeMemory');
+const { isLlmReviewEnabled, runLlmReview } = require('./llmReview');
function nowIso() {
return new Date().toISOString();
@@ -701,10 +704,14 @@ function rollbackNewUntrackedFiles({ repoRoot, baselineUntracked }) {
// This prevents "ghost skill directories" where mkdir succeeded but
// file creation failed/was rolled back. Without this, empty dirs like
// skills/anima/, skills/oblivion/ etc. accumulate after failed innovations.
+ // SAFETY: never remove top-level structural directories (skills/, src/, etc.)
+ // or critical protected directories. Only remove leaf subdirectories.
var dirsToCheck = new Set();
for (var di = 0; di < deleted.length; di++) {
var dir = path.dirname(deleted[di]);
while (dir && dir !== '.' && dir !== '/') {
+ var normalized = dir.replace(/\\/g, '/');
+ if (!normalized.includes('/')) break;
dirsToCheck.add(dir);
dir = path.dirname(dir);
}
@@ -713,6 +720,7 @@ function rollbackNewUntrackedFiles({ repoRoot, baselineUntracked }) {
var sortedDirs = Array.from(dirsToCheck).sort(function (a, b) { return b.length - a.length; });
var removedDirs = [];
for (var si = 0; si < sortedDirs.length; si++) {
+ if (isCriticalProtectedPath(sortedDirs[si] + '/')) continue;
var dirAbs = path.join(repoRoot, sortedDirs[si]);
try {
var entries = fs.readdirSync(dirAbs);
@@ -957,8 +965,32 @@ function readRecentSessionInputs() {
return { recentSessionTranscript, todayLog: todayLogContent, memorySnippet, userSnippet };
}
+function isGitRepo(dir) {
+ try {
+ execSync('git rev-parse --git-dir', {
+ cwd: dir, encoding: 'utf8',
+ stdio: ['ignore', 'pipe', 'pipe'], timeout: 5000,
+ });
+ return true;
+ } catch (_) {
+ return false;
+ }
+}
+
function solidify({ intent, summary, dryRun = false, rollbackOnFailure = true } = {}) {
const repoRoot = getRepoRoot();
+
+ if (!isGitRepo(repoRoot)) {
+ console.error('[Solidify] FATAL: Not a git repository (' + repoRoot + ').');
+ console.error('[Solidify] Solidify requires git for rollback, diff capture, and blast radius.');
+ console.error('[Solidify] Run "git init && git add -A && git commit -m init" first.');
+ return {
+ ok: false,
+ status: 'failed',
+ failure_reason: 'not_a_git_repository',
+ event: null,
+ };
+ }
const state = readStateForSolidify();
const lastRun = state && state.last_run ? state.last_run : null;
const genes = loadGenes();
@@ -1053,6 +1085,29 @@ function solidify({ intent, summary, dryRun = false, rollbackOnFailure = true }
console.error(`[Solidify] CANARY FAILED: ${canary.err}`);
}
+ // Optional LLM review: when EVOLVER_LLM_REVIEW=true, submit diff for review.
+ let llmReviewResult = null;
+ if (constraintCheck.ok && validation.ok && protocolViolations.length === 0 && isLlmReviewEnabled()) {
+ try {
+ const reviewDiff = captureDiffSnapshot(repoRoot);
+ llmReviewResult = runLlmReview({
+ diff: reviewDiff,
+ gene: geneUsed,
+ signals,
+ mutation,
+ });
+ if (llmReviewResult && llmReviewResult.approved === false) {
+ constraintCheck.violations.push('llm_review_rejected: ' + (llmReviewResult.summary || 'no reason'));
+ constraintCheck.ok = false;
+ console.log('[LLMReview] Change REJECTED: ' + (llmReviewResult.summary || ''));
+ } else if (llmReviewResult) {
+ console.log('[LLMReview] Change approved (confidence: ' + (llmReviewResult.confidence || '?') + ')');
+ }
+ } catch (e) {
+ console.log('[LLMReview] Failed (non-fatal): ' + (e && e.message ? e.message : e));
+ }
+ }
+
// Build standardized ValidationReport (machine-readable, interoperable).
const validationReport = buildValidationReport({
geneId: geneUsed && geneUsed.id ? geneUsed.id : null,
@@ -1212,7 +1267,12 @@ function solidify({ intent, summary, dryRun = false, rollbackOnFailure = true }
if (!dryRun && !success && rollbackOnFailure) {
rollbackTracked(repoRoot);
- rollbackNewUntrackedFiles({ repoRoot, baselineUntracked: lastRun && lastRun.baseline_untracked ? lastRun.baseline_untracked : [] });
+ // Only clean up new untracked files when a valid baseline exists.
+ // Without a baseline, we cannot distinguish pre-existing untracked files
+ // from AI-generated ones, so deleting would be destructive.
+ if (lastRun && Array.isArray(lastRun.baseline_untracked)) {
+ rollbackNewUntrackedFiles({ repoRoot, baselineUntracked: lastRun.baseline_untracked });
+ }
}
// Apply epigenetic marks to the gene based on outcome and environment
@@ -1254,6 +1314,21 @@ function solidify({ intent, summary, dryRun = false, rollbackOnFailure = true }
};
if (!dryRun) writeStateForSolidify(state);
+ if (!dryRun) {
+ try {
+ recordNarrative({
+ gene: geneUsed,
+ signals,
+ mutation,
+ outcome: event.outcome,
+ blast,
+ capsule,
+ });
+ } catch (e) {
+ console.log('[Narrative] Record failed (non-fatal): ' + (e && e.message ? e.message : e));
+ }
+ }
+
// Search-First Evolution: auto-publish eligible capsules to the Hub (as Gene+Capsule bundle).
let publishResult = null;
if (!dryRun && capsule && capsule.a2a && capsule.a2a.eligible_to_broadcast) {
@@ -1327,6 +1402,21 @@ function solidify({ intent, summary, dryRun = false, rollbackOnFailure = true }
});
}
publishResult = { attempted: true, asset_id: capsule.asset_id || capsule.id, bundle: true };
+ logAssetCall({
+ run_id: lastRun && lastRun.run_id ? lastRun.run_id : null,
+ action: 'asset_publish',
+ asset_id: capsule.asset_id || capsule.id,
+ asset_type: 'Capsule',
+ source_node_id: null,
+ chain_id: publishChainId || null,
+ signals: Array.isArray(capsule.trigger) ? capsule.trigger : [],
+ extra: {
+ source_type: sourceType,
+ reused_asset_id: reusedAssetId,
+ gene_id: publishGene && publishGene.id ? publishGene.id : null,
+ parent: parentRef || null,
+ },
+ });
} else {
publishResult = { attempted: false, reason: 'no_hub_url' };
}
@@ -1340,6 +1430,14 @@ function solidify({ intent, summary, dryRun = false, rollbackOnFailure = true }
: sourceType === 'reused' ? 'skip_direct_reused_asset'
: 'below_min_score';
publishResult = { attempted: false, reason };
+ logAssetCall({
+ run_id: lastRun && lastRun.run_id ? lastRun.run_id : null,
+ action: 'asset_publish_skip',
+ asset_id: capsule.asset_id || capsule.id,
+ asset_type: 'Capsule',
+ reason,
+ signals: Array.isArray(capsule.trigger) ? capsule.trigger : [],
+ });
}
}
@@ -1452,6 +1550,7 @@ function solidify({ intent, summary, dryRun = false, rollbackOnFailure = true }
module.exports = {
solidify,
+ isGitRepo,
readStateForSolidify,
writeStateForSolidify,
isValidationCommandAllowed,
diff --git a/skills/capability-evolver/src/gep/taskReceiver.js b/skills/capability-evolver/src/gep/taskReceiver.js
index 743a132..4e9e4de 100644
--- a/skills/capability-evolver/src/gep/taskReceiver.js
+++ b/skills/capability-evolver/src/gep/taskReceiver.js
@@ -82,7 +82,8 @@ async function fetchTasks(opts) {
}
return result;
- } catch {
+ } catch (err) {
+ console.warn("[TaskReceiver] fetchTasks failed:", err && err.message ? err.message : err);
return { tasks: [] };
}
}
@@ -150,7 +151,7 @@ function estimateCapabilityMatch(task, memoryEvents) {
var weightSum = 0;
for (var sk in totalBySignalKey) {
// Reconstruct signals from the key for comparison
- var skParts = sk.split(':').map(function(s) { return s.trim().toLowerCase(); }).filter(Boolean);
+ var skParts = sk.split('|').map(function(s) { return s.trim().toLowerCase(); }).filter(Boolean);
var sim = jaccard(taskSignals, skParts);
if (sim < 0.15) continue;
diff --git a/skills/capability-evolver/src/ops/cleanup.js b/skills/capability-evolver/src/ops/cleanup.js
index 48e0770..71cd4fa 100644
--- a/skills/capability-evolver/src/ops/cleanup.js
+++ b/skills/capability-evolver/src/ops/cleanup.js
@@ -9,6 +9,14 @@ const { getEvolutionDir } = require('../gep/paths');
var MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours
var MIN_KEEP = 10;
+function safeBatchDelete(batch) {
+ var deleted = 0;
+ for (var i = 0; i < batch.length; i++) {
+ try { fs.unlinkSync(batch[i]); deleted++; } catch (_) {}
+ }
+ return deleted;
+}
+
function run() {
var evoDir = getEvolutionDir();
if (!fs.existsSync(evoDir)) return;
@@ -26,36 +34,18 @@ function run() {
var deleted = 0;
// Phase 1: Age-based cleanup (keep at least MIN_KEEP)
- // [OPTIMIZATION] Batch deletion for age-based cleanup as well
- const filesToDelete = [];
+ var filesToDelete = [];
for (var i = MIN_KEEP; i < files.length; i++) {
if (now - files[i].mtime > MAX_AGE_MS) {
filesToDelete.push(files[i].path);
}
}
-
+
if (filesToDelete.length > 0) {
- const BATCH_SIZE = 50;
- for (let i = 0; i < filesToDelete.length; i += BATCH_SIZE) {
- const batch = filesToDelete.slice(i, i + BATCH_SIZE);
- try {
- // Remove package-lock.json if it exists (not relevant here but good practice in other contexts)
- // Use rm -f with quotes to handle paths safely
- // Phase 1 optimization update: mirroring phase 2 logic
- const args = batch.map(function(p) { return '"' + p + '"'; }).join(' ');
- require('child_process').execSync('rm -f ' + args, { stdio: 'ignore' });
- deleted += batch.length;
- } catch (e) {
- // Fallback to serial deletion if batch fails
- batch.forEach(function(p) {
- try { fs.unlinkSync(p); deleted++; } catch (_) {}
- });
- }
- }
+ deleted += safeBatchDelete(filesToDelete);
}
- // Phase 2: Size-based safety cap (keep max 10 files total to drastically reduce bloat)
- // Re-scan remaining files after age cleanup
+ // Phase 2: Size-based safety cap (keep max 10 files total)
try {
var remainingFiles = fs.readdirSync(evoDir)
.filter(function(f) { return /^gep_prompt_.*\.(json|txt)$/.test(f); })
@@ -66,29 +56,10 @@ function run() {
})
.sort(function(a, b) { return b.mtime - a.mtime; }); // newest first
- // [OPTIMIZATION] Batch deletion using execSync('rm') for speed and robustness
var MAX_FILES = 10;
if (remainingFiles.length > MAX_FILES) {
- const toDelete = remainingFiles.slice(MAX_FILES).map(function(f) { return f.path; });
-
- // Chunking into batches of 50 to avoid E2BIG on some systems,
- // though with MAX_FILES=10 and typical usage, list won't be huge.
- const BATCH_SIZE = 50;
- for (let i = 0; i < toDelete.length; i += BATCH_SIZE) {
- const batch = toDelete.slice(i, i + BATCH_SIZE);
- try {
- // Safe bulk delete via shell, faster than serial unlinkSync
- // Using "rm -f" to ignore non-existent files
- const args = batch.map(function(p) { return '"' + p + '"'; }).join(' ');
- require('child_process').execSync('rm -f ' + args, { stdio: 'ignore' });
- deleted += batch.length;
- } catch (e) {
- // Fallback to serial if batch fails
- batch.forEach(function(p) {
- try { fs.unlinkSync(p); deleted++; } catch (_) {}
- });
- }
- }
+ var toDelete = remainingFiles.slice(MAX_FILES).map(function(f) { return f.path; });
+ deleted += safeBatchDelete(toDelete);
}
} catch (e) {
console.warn('[Cleanup] Phase 2 failed:', e.message);
diff --git a/workspace/.learnings/ERRORS.md b/workspace/.learnings/ERRORS.md
new file mode 100644
index 0000000..ee77a45
--- /dev/null
+++ b/workspace/.learnings/ERRORS.md
@@ -0,0 +1,49 @@
+# Errors
+
+Command failures, exceptions, and issues captured during development.
+
+**Areas**: frontend | backend | infra | tests | docs | config
+**Statuses**: pending | in_progress | resolved | wont_fix
+
+## Status Definitions
+
+| Status | Meaning |
+|--------|---------|
+| `pending` | Not yet addressed |
+| `in_progress` | Actively being worked on |
+| `resolved` | Issue fixed |
+| `wont_fix` | Decided not to address (reason in Resolution) |
+
+## Entry Format
+
+```markdown
+## [ERR-YYYYMMDD-XXX] title
+
+**Logged**: ISO-8601 timestamp
+**Priority**: low | medium | high | critical
+**Status**: pending
+**Area**: frontend | backend | infra | tests | docs | config
+
+### Summary
+Brief description of what failed
+
+### Error
+```
+Actual error message
+```
+
+### Context
+- What was attempted
+- Input/parameters used
+- Environment details
+
+### Suggested Fix
+How this could be resolved
+
+### Metadata
+- Reproducible: yes | no | unknown
+- Related Files: path/to/file.ext
+- See Also: ERR-20250110-001
+
+---
+```
diff --git a/workspace/.learnings/FEATURE_REQUESTS.md b/workspace/.learnings/FEATURE_REQUESTS.md
new file mode 100644
index 0000000..80fa8f3
--- /dev/null
+++ b/workspace/.learnings/FEATURE_REQUESTS.md
@@ -0,0 +1,44 @@
+# Feature Requests
+
+User-requested capabilities that don't exist yet.
+
+**Areas**: frontend | backend | infra | tests | docs | config
+**Statuses**: pending | in_progress | resolved | wont_fix
+
+## Status Definitions
+
+| Status | Meaning |
+|--------|---------|
+| `pending` | Not yet addressed |
+| `in_progress` | Actively being worked on |
+| `resolved` | Feature implemented |
+| `wont_fix` | Decided not to implement (reason in Resolution) |
+
+## Entry Format
+
+```markdown
+## [FEAT-YYYYMMDD-XXX] title
+
+**Logged**: ISO-8601 timestamp
+**Priority**: low | medium | high
+**Status**: pending
+**Area**: frontend | backend | infra | tests | docs | config
+
+### Requested Capability
+What the user wanted to do
+
+### User Context
+Why they needed it
+
+### Complexity Estimate
+simple | medium | complex
+
+### Suggested Implementation
+How this could be built
+
+### Metadata
+- Frequency: first_time | recurring
+- Related Features: existing_feature_name
+
+---
+```
diff --git a/workspace/.learnings/LEARNINGS.md b/workspace/.learnings/LEARNINGS.md
new file mode 100644
index 0000000..6993f9b
--- /dev/null
+++ b/workspace/.learnings/LEARNINGS.md
@@ -0,0 +1,45 @@
+# Learnings
+
+Corrections, insights, and knowledge gaps captured during development.
+
+**Categories**: correction | insight | knowledge_gap | best_practice
+**Areas**: frontend | backend | infra | tests | docs | config
+**Statuses**: pending | in_progress | resolved | wont_fix | promoted | promoted_to_skill
+
+## Status Definitions
+
+| Status | Meaning |
+|--------|---------|
+| `pending` | Not yet addressed |
+| `in_progress` | Actively being worked on |
+| `resolved` | Issue fixed or knowledge integrated |
+| `wont_fix` | Decided not to address (reason in Resolution) |
+| `promoted` | Elevated to CLAUDE.md, AGENTS.md, or copilot-instructions.md |
+| `promoted_to_skill` | Extracted as a reusable skill |
+
+## Skill Extraction Fields
+
+When a learning is promoted to a skill, add these fields:
+
+```markdown
+**Status**: promoted_to_skill
+**Skill-Path**: skills/skill-name
+```
+
+Example:
+```markdown
+## [LRN-20250115-001] best_practice
+
+**Logged**: 2025-01-15T10:00:00Z
+**Priority**: high
+**Status**: promoted_to_skill
+**Skill-Path**: skills/docker-m1-fixes
+**Area**: infra
+
+### Summary
+Docker build fails on Apple Silicon due to platform mismatch
+...
+```
+
+---
+