【hermes-agent】Hermes Agent 自我进化原理之一

Hermes Agent 自我进化原理

源码位置:github.com/hermes-agent

核心文件:agent/background_review.py、agent/curator.py、agent/learn_prompt.py、agent/learning_graph.py、agent/learning_mutations.py、tools/skill_usage.py、tools/skill_ledger.py、agent/review_engine.py、agent/review_idle_queue.py、agent/insights.py、agent/provider_projection.py、agent/manual_compression_feedback.py、agent/turn_finalizer.py、agent/turn_context.py、agent/agent_init.py


一、总体架构

Hermes Agent 的自我进化系统是一个多层级、闭环式 的学习与维护体系。它在"提示词缓存神圣不可侵犯"和"核心窄、能力在边缘"两大不变量约束下,实现了会话后自动审查 → 技能/记忆更新 → 后台策展维护 → 主动学习 → 可视化反馈的完整进化循环。

系统不是一个简单的"学完就存"的线性管道,而是一个具有多重反馈回路 的复杂自适应系统:每一轮会话结束后,系统会自动评估"这次会话是否产生了值得固化的知识";定期地,一个独立的策展器(curator)会扫描整个技能库,将碎片化的技能整合为类级指令;用户也可以随时通过 /learn 命令主动将外部知识蒸馏为技能。这三条路径------自动、定时、手动------共同构成了一个持续进化的知识库,而非一个被动的日志记录器。

1.1 四大子系统概览

子系统 核心机制 触发方式 关键文件 安全约束
后台审查 每轮结束后 fork 子代理评估会话 自动(nudge 计数器) background_review.py 工具白名单 + 受保护技能 + read-before-write
技能策展 状态自动转换 + LLM 合并整合 定时(interval_hours) curator.py 归档不删除 + 预运行快照 + 账本审计
主动学习 /learn 命令从会话/资料蒸馏技能 用户发起 learn_prompt.py 源文本卫生 + 创作标准 + 知识库布局
学习可视化 技能-记忆图谱 + journey 节点 实时构建 learning_graph.py + learning_mutations.py 只读图谱 + 用户可编辑 journey

1.2 系统架构总图

#mermaid-svg-ShGVj534RwH6SSg1{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ShGVj534RwH6SSg1 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ShGVj534RwH6SSg1 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ShGVj534RwH6SSg1 .error-icon{fill:#552222;}#mermaid-svg-ShGVj534RwH6SSg1 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ShGVj534RwH6SSg1 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ShGVj534RwH6SSg1 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ShGVj534RwH6SSg1 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ShGVj534RwH6SSg1 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ShGVj534RwH6SSg1 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ShGVj534RwH6SSg1 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ShGVj534RwH6SSg1 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ShGVj534RwH6SSg1 .marker.cross{stroke:#333333;}#mermaid-svg-ShGVj534RwH6SSg1 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ShGVj534RwH6SSg1 p{margin:0;}#mermaid-svg-ShGVj534RwH6SSg1 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ShGVj534RwH6SSg1 .cluster-label text{fill:#333;}#mermaid-svg-ShGVj534RwH6SSg1 .cluster-label span{color:#333;}#mermaid-svg-ShGVj534RwH6SSg1 .cluster-label span p{background-color:transparent;}#mermaid-svg-ShGVj534RwH6SSg1 .label text,#mermaid-svg-ShGVj534RwH6SSg1 span{fill:#333;color:#333;}#mermaid-svg-ShGVj534RwH6SSg1 .node rect,#mermaid-svg-ShGVj534RwH6SSg1 .node circle,#mermaid-svg-ShGVj534RwH6SSg1 .node ellipse,#mermaid-svg-ShGVj534RwH6SSg1 .node polygon,#mermaid-svg-ShGVj534RwH6SSg1 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ShGVj534RwH6SSg1 .rough-node .label text,#mermaid-svg-ShGVj534RwH6SSg1 .node .label text,#mermaid-svg-ShGVj534RwH6SSg1 .image-shape .label,#mermaid-svg-ShGVj534RwH6SSg1 .icon-shape .label{text-anchor:middle;}#mermaid-svg-ShGVj534RwH6SSg1 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ShGVj534RwH6SSg1 .rough-node .label,#mermaid-svg-ShGVj534RwH6SSg1 .node .label,#mermaid-svg-ShGVj534RwH6SSg1 .image-shape .label,#mermaid-svg-ShGVj534RwH6SSg1 .icon-shape .label{text-align:center;}#mermaid-svg-ShGVj534RwH6SSg1 .node.clickable{cursor:pointer;}#mermaid-svg-ShGVj534RwH6SSg1 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ShGVj534RwH6SSg1 .arrowheadPath{fill:#333333;}#mermaid-svg-ShGVj534RwH6SSg1 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ShGVj534RwH6SSg1 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ShGVj534RwH6SSg1 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ShGVj534RwH6SSg1 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ShGVj534RwH6SSg1 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ShGVj534RwH6SSg1 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ShGVj534RwH6SSg1 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ShGVj534RwH6SSg1 .cluster text{fill:#333;}#mermaid-svg-ShGVj534RwH6SSg1 .cluster span{color:#333;}#mermaid-svg-ShGVj534RwH6SSg1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ShGVj534RwH6SSg1 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ShGVj534RwH6SSg1 rect.text{fill:none;stroke-width:0;}#mermaid-svg-ShGVj534RwH6SSg1 .icon-shape,#mermaid-svg-ShGVj534RwH6SSg1 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ShGVj534RwH6SSg1 .icon-shape p,#mermaid-svg-ShGVj534RwH6SSg1 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ShGVj534RwH6SSg1 .icon-shape .label rect,#mermaid-svg-ShGVj534RwH6SSg1 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ShGVj534RwH6SSg1 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ShGVj534RwH6SSg1 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ShGVj534RwH6SSg1 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Hermes Agent 自我进化系统
安全与审计
学习可视化
用户主动学习
后台策展维护 (定时)
自动进化循环 (无人干预)
达到阈值
consolidate=true
实时更新
实时更新
状态变更
会话数据
每次变更
运行前
安全捕获失败
审计账本

.curator_ledger.jsonl
会话轮次

run_conversation()
Nudge 计数器

_iters_since_skill

_turns_since_memory
后台审查 Fork

(cache-parity)
审查评估

记忆 + 技能信号
写入存储

MEMORY.md / SKILL.md
Curator 定时器

interval_hours
自动状态转换

active→stale→archived

(纯函数, 无 LLM)
归档/合并

.archive/
LLM 合并整合

umbrella-building
Cron 引用重写

_rewrite_cron_refs()
运行报告

run.json + REPORT.md
/learn 命令
蒸馏提炼

从会话/URL/文件
创作标准

description ≤ 60 字符

知识库布局
skill_manage

create/patch/edit
学习图谱

技能节点 + 记忆节点

  • related_skills 边

  • 词汇重叠边
    洞察引擎

SQLite 聚合统计
内容寻址存储

sha256 去重
预运行快照

curator_backup
单编辑回滚

FAIL CLOSED
Journey 节点

用户可编辑/删除

1.3 进化循环的本质

自我进化的本质不是"记录发生了什么",而是将经验固化为可复用的类级指令。系统区分两种知识:

  • 记忆(Memory) :回答"用户是谁"和"当前操作状态是什么"------关于用户身份、偏好、当前情境的事实。存储在 ~/.hermes/memories/MEMORY.md 和 USER.md 中。
  • 技能(Skill) :回答"如何为这个用户做这类任务"------工作流程、有效工具和命令、执行顺序、用户对结果的偏好、耗时陷阱。存储在 ~/.hermes/skills/ 下的 SKILL.md 及其支持文件中。

这个区分至关重要:当用户抱怨"你做得太冗长了",记忆会记录"用户偏好简洁回复",但技能需要在其 governing skill 中嵌入这个偏好------这样下一个会话从一开始就知道。记忆说"谁",技能说"怎么做"。

1.4 与核心系统的关系

自我进化系统严格遵循两大不变量:

  1. 提示词缓存神圣不可侵犯:后台审查 fork 继承父代理的缓存前缀(同模型时为温暖缓存读取),审查写入通过工具调用(user/tool 消息)而非修改系统提示词。系统提示词在会话生命周期内字节稳定。
  2. 核心窄,能力在边缘 :自我进化通过技能(边缘)而非核心工具实现。skill_manage 是服务门控工具,memory 是内联工具------它们都不是核心工具的扩展。整个进化系统的逻辑分布在 agent/ 和 tools/ 下的多个文件中,而非集中在核心循环里。

二、自我进化核心循环

2.1 循环全景

自我进化的核心是一个每轮触发 的闭环:用户消息 → 代理执行 → 轮次结束 → 后台审查 fork → 评估"是否该保存/更新技能或记忆" → 写入存储。这个循环在 turn_finalizer.py:590-626 中触发,是整个进化系统最频繁的入口点。
Memory Store Skill Store Review Fork background_review turn_finalizer AIAgent 用户 Memory Store Skill Store Review Fork background_review turn_finalizer AIAgent 用户 #mermaid-svg-S2A9UHnBv9AsYPEn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-S2A9UHnBv9AsYPEn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-S2A9UHnBv9AsYPEn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-S2A9UHnBv9AsYPEn .error-icon{fill:#552222;}#mermaid-svg-S2A9UHnBv9AsYPEn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-S2A9UHnBv9AsYPEn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-S2A9UHnBv9AsYPEn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-S2A9UHnBv9AsYPEn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-S2A9UHnBv9AsYPEn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-S2A9UHnBv9AsYPEn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-S2A9UHnBv9AsYPEn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-S2A9UHnBv9AsYPEn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-S2A9UHnBv9AsYPEn .marker.cross{stroke:#333333;}#mermaid-svg-S2A9UHnBv9AsYPEn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-S2A9UHnBv9AsYPEn p{margin:0;}#mermaid-svg-S2A9UHnBv9AsYPEn .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-S2A9UHnBv9AsYPEn text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-S2A9UHnBv9AsYPEn .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-S2A9UHnBv9AsYPEn .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-S2A9UHnBv9AsYPEn .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-S2A9UHnBv9AsYPEn .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-S2A9UHnBv9AsYPEn #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-S2A9UHnBv9AsYPEn .sequenceNumber{fill:white;}#mermaid-svg-S2A9UHnBv9AsYPEn #sequencenumber{fill:#333;}#mermaid-svg-S2A9UHnBv9AsYPEn #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-S2A9UHnBv9AsYPEn .messageText{fill:#333;stroke:none;}#mermaid-svg-S2A9UHnBv9AsYPEn .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-S2A9UHnBv9AsYPEn .labelText,#mermaid-svg-S2A9UHnBv9AsYPEn .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-S2A9UHnBv9AsYPEn .loopText,#mermaid-svg-S2A9UHnBv9AsYPEn .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-S2A9UHnBv9AsYPEn .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-S2A9UHnBv9AsYPEn .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-S2A9UHnBv9AsYPEn .noteText,#mermaid-svg-S2A9UHnBv9AsYPEn .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-S2A9UHnBv9AsYPEn .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-S2A9UHnBv9AsYPEn .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-S2A9UHnBv9AsYPEn .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-S2A9UHnBv9AsYPEn .actorPopupMenu{position:absolute;}#mermaid-svg-S2A9UHnBv9AsYPEn .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-S2A9UHnBv9AsYPEn .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-S2A9UHnBv9AsYPEn .actor-man circle,#mermaid-svg-S2A9UHnBv9AsYPEn line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-S2A9UHnBv9AsYPEn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} _skill_nudge_interval > 0且 _iters_since_skill >= 阈值且 skill_manage 在工具列表中 继承父代理的:• 缓存系统提示词 (同模型)• tools\[\] 字节一致• session_id (前缀缓存温暖)• 运行时凭证 altshould_review_skills == true 用户消息run_conversation()工具迭代 (_iters_since_skill++)返回 final_response轮次结束检查 nudge 计数器_iters_since_skill = 0_spawn_background_review()prepare_background_review_run()build_cache_parity_fork()设置工具白名单(skill_manage + memory + read_file)run_conversation(审查提示词)评估会话信号skill_manage(patch/create)memory(add/replace)审查完成 + 动作摘要"💾 Self-improvement review: ..."

2.2 触发条件:双 Nudge 计数器

系统使用两个独立的计数器控制审查触发,在 agent_init.py:1234-1304 初始化。这两个计数器的设计哲学是:不要每轮都审查(太贵),也不要太少(学习机会丢失)。
#mermaid-svg-DkQCpU6Eq4NbTH8j{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DkQCpU6Eq4NbTH8j .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DkQCpU6Eq4NbTH8j .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DkQCpU6Eq4NbTH8j .error-icon{fill:#552222;}#mermaid-svg-DkQCpU6Eq4NbTH8j .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DkQCpU6Eq4NbTH8j .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DkQCpU6Eq4NbTH8j .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DkQCpU6Eq4NbTH8j .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DkQCpU6Eq4NbTH8j .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DkQCpU6Eq4NbTH8j .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DkQCpU6Eq4NbTH8j .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DkQCpU6Eq4NbTH8j .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DkQCpU6Eq4NbTH8j .marker.cross{stroke:#333333;}#mermaid-svg-DkQCpU6Eq4NbTH8j svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DkQCpU6Eq4NbTH8j p{margin:0;}#mermaid-svg-DkQCpU6Eq4NbTH8j .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DkQCpU6Eq4NbTH8j .cluster-label text{fill:#333;}#mermaid-svg-DkQCpU6Eq4NbTH8j .cluster-label span{color:#333;}#mermaid-svg-DkQCpU6Eq4NbTH8j .cluster-label span p{background-color:transparent;}#mermaid-svg-DkQCpU6Eq4NbTH8j .label text,#mermaid-svg-DkQCpU6Eq4NbTH8j span{fill:#333;color:#333;}#mermaid-svg-DkQCpU6Eq4NbTH8j .node rect,#mermaid-svg-DkQCpU6Eq4NbTH8j .node circle,#mermaid-svg-DkQCpU6Eq4NbTH8j .node ellipse,#mermaid-svg-DkQCpU6Eq4NbTH8j .node polygon,#mermaid-svg-DkQCpU6Eq4NbTH8j .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DkQCpU6Eq4NbTH8j .rough-node .label text,#mermaid-svg-DkQCpU6Eq4NbTH8j .node .label text,#mermaid-svg-DkQCpU6Eq4NbTH8j .image-shape .label,#mermaid-svg-DkQCpU6Eq4NbTH8j .icon-shape .label{text-anchor:middle;}#mermaid-svg-DkQCpU6Eq4NbTH8j .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DkQCpU6Eq4NbTH8j .rough-node .label,#mermaid-svg-DkQCpU6Eq4NbTH8j .node .label,#mermaid-svg-DkQCpU6Eq4NbTH8j .image-shape .label,#mermaid-svg-DkQCpU6Eq4NbTH8j .icon-shape .label{text-align:center;}#mermaid-svg-DkQCpU6Eq4NbTH8j .node.clickable{cursor:pointer;}#mermaid-svg-DkQCpU6Eq4NbTH8j .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DkQCpU6Eq4NbTH8j .arrowheadPath{fill:#333333;}#mermaid-svg-DkQCpU6Eq4NbTH8j .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DkQCpU6Eq4NbTH8j .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DkQCpU6Eq4NbTH8j .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DkQCpU6Eq4NbTH8j .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DkQCpU6Eq4NbTH8j .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DkQCpU6Eq4NbTH8j .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DkQCpU6Eq4NbTH8j .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DkQCpU6Eq4NbTH8j .cluster text{fill:#333;}#mermaid-svg-DkQCpU6Eq4NbTH8j .cluster span{color:#333;}#mermaid-svg-DkQCpU6Eq4NbTH8j div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DkQCpU6Eq4NbTH8j .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DkQCpU6Eq4NbTH8j rect.text{fill:none;stroke-width:0;}#mermaid-svg-DkQCpU6Eq4NbTH8j .icon-shape,#mermaid-svg-DkQCpU6Eq4NbTH8j .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DkQCpU6Eq4NbTH8j .icon-shape p,#mermaid-svg-DkQCpU6Eq4NbTH8j .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DkQCpU6Eq4NbTH8j .icon-shape .label rect,#mermaid-svg-DkQCpU6Eq4NbTH8j .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DkQCpU6Eq4NbTH8j .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DkQCpU6Eq4NbTH8j .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DkQCpU6Eq4NbTH8j :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 额外触发条件
记忆审查触发
技能审查触发
是
是
是
_iters_since_skill

每次工具迭代 +1

(turn_iteration_prep.py:119)
_iters_since_skill

>= _skill_nudge_interval?

(默认 10)
触发技能审查

_iters_since_skill = 0
_turns_since_memory

每次用户轮次 +1

(_tick_memory_nudge)
_turns_since_memory

>= _memory_nudge_interval?

(默认 10)
触发记忆审查

_turns_since_memory = 0
skill_manage 在 valid_tool_names 中
memory 在 valid_tool_names 中

且 _memory_store 存在
final_response 非空

且未中断
skip_background_review == False
同时满足?

C3 + C4
_spawn_background_review()

关键设计细节:

  1. _iters_since_skill 的重置逻辑 (tool_executor.py:686):当代理主动调用 skill_manage 时,计数器重置为 0。这意味着代理自己更新技能后不需要立即再审查------代理已经在会话中学习了,不需要 fork 来重复发现。

  2. provider_projection.py:45 的折算机制 :将 agent-as-provider(如 ACP CLI shim)的工具迭代也折算进 _iters_since_skill。这确保自改进循环不会因为提供者代理运行工具而"致盲"------如果提供者代理运行了 15 次工具迭代,_iters_since_skill 也会增加 15,达到阈值后触发审查。

  3. 跨会话连续性 (turn_context.py:614-619):计数器在会话恢复时从历史消息水合。这意味着如果用户在会话 A 中进行了 8 次工具迭代,然后切换到会话 B,计数器不会重置------它从 8 继续,再 2 次迭代就会触发审查。

  4. 默认值都是 10:这意味着大约每 10 轮工具迭代或 10 轮用户对话后触发一次审查。这个值是经过实践调优的------太低会导致审查过于频繁(成本高),太高会导致学习机会丢失。

  5. skip_background_review 标志 :Cron 会话默认设置 skip_memory=True,这意味着 cron 会话不会触发记忆审查。这是因为 cron 会话没有用户交互,不产生用户偏好信号。


三、后台审查 Fork 机制

后台审查是自我进化系统中最精巧的部分。它需要在每轮结束后"复制"一个代理来评估会话,但又不能破坏提示词缓存、不能让审查代理拥有完整工具权限、不能阻塞用户下一轮交互。解决方案是 cache-parity fork------一种精心设计的子代理派生机制。

3.1 Fork 的核心约束

#mermaid-svg-j1xIIMS4nD6OMGIm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-j1xIIMS4nD6OMGIm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-j1xIIMS4nD6OMGIm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-j1xIIMS4nD6OMGIm .error-icon{fill:#552222;}#mermaid-svg-j1xIIMS4nD6OMGIm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-j1xIIMS4nD6OMGIm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-j1xIIMS4nD6OMGIm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-j1xIIMS4nD6OMGIm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-j1xIIMS4nD6OMGIm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-j1xIIMS4nD6OMGIm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-j1xIIMS4nD6OMGIm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-j1xIIMS4nD6OMGIm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-j1xIIMS4nD6OMGIm .marker.cross{stroke:#333333;}#mermaid-svg-j1xIIMS4nD6OMGIm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-j1xIIMS4nD6OMGIm p{margin:0;}#mermaid-svg-j1xIIMS4nD6OMGIm .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-j1xIIMS4nD6OMGIm .cluster-label text{fill:#333;}#mermaid-svg-j1xIIMS4nD6OMGIm .cluster-label span{color:#333;}#mermaid-svg-j1xIIMS4nD6OMGIm .cluster-label span p{background-color:transparent;}#mermaid-svg-j1xIIMS4nD6OMGIm .label text,#mermaid-svg-j1xIIMS4nD6OMGIm span{fill:#333;color:#333;}#mermaid-svg-j1xIIMS4nD6OMGIm .node rect,#mermaid-svg-j1xIIMS4nD6OMGIm .node circle,#mermaid-svg-j1xIIMS4nD6OMGIm .node ellipse,#mermaid-svg-j1xIIMS4nD6OMGIm .node polygon,#mermaid-svg-j1xIIMS4nD6OMGIm .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-j1xIIMS4nD6OMGIm .rough-node .label text,#mermaid-svg-j1xIIMS4nD6OMGIm .node .label text,#mermaid-svg-j1xIIMS4nD6OMGIm .image-shape .label,#mermaid-svg-j1xIIMS4nD6OMGIm .icon-shape .label{text-anchor:middle;}#mermaid-svg-j1xIIMS4nD6OMGIm .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-j1xIIMS4nD6OMGIm .rough-node .label,#mermaid-svg-j1xIIMS4nD6OMGIm .node .label,#mermaid-svg-j1xIIMS4nD6OMGIm .image-shape .label,#mermaid-svg-j1xIIMS4nD6OMGIm .icon-shape .label{text-align:center;}#mermaid-svg-j1xIIMS4nD6OMGIm .node.clickable{cursor:pointer;}#mermaid-svg-j1xIIMS4nD6OMGIm .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-j1xIIMS4nD6OMGIm .arrowheadPath{fill:#333333;}#mermaid-svg-j1xIIMS4nD6OMGIm .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-j1xIIMS4nD6OMGIm .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-j1xIIMS4nD6OMGIm .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-j1xIIMS4nD6OMGIm .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-j1xIIMS4nD6OMGIm .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-j1xIIMS4nD6OMGIm .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-j1xIIMS4nD6OMGIm .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-j1xIIMS4nD6OMGIm .cluster text{fill:#333;}#mermaid-svg-j1xIIMS4nD6OMGIm .cluster span{color:#333;}#mermaid-svg-j1xIIMS4nD6OMGIm div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-j1xIIMS4nD6OMGIm .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-j1xIIMS4nD6OMGIm rect.text{fill:none;stroke-width:0;}#mermaid-svg-j1xIIMS4nD6OMGIm .icon-shape,#mermaid-svg-j1xIIMS4nD6OMGIm .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-j1xIIMS4nD6OMGIm .icon-shape p,#mermaid-svg-j1xIIMS4nD6OMGIm .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-j1xIIMS4nD6OMGIm .icon-shape .label rect,#mermaid-svg-j1xIIMS4nD6OMGIm .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-j1xIIMS4nD6OMGIm .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-j1xIIMS4nD6OMGIm .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-j1xIIMS4nD6OMGIm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Fork 绝不触碰
系统提示词内容

(字节稳定)
父代理的对话历史

(不注入审查 fork)
父代理的工具状态

(独立沙箱)
Fork 必须覆盖 (安全隔离)
工具白名单

仅 skill_manage + memory + read_file
审查提示词

替换用户消息
max_iterations

限制审查轮次
审查模式标志

is_background_review=True
取消令牌

cancel_event
Fork 必须继承 (缓存对齐)
系统提示词

(同模型时为温暖缓存读取)
tools\[\] 数组

(字节一致)
session_id

(前缀缓存温暖)
运行时凭证

(API keys, OAuth)
模型配置

(model_name, provider)

3.2 Fork 的执行流程

LLM Provider ToolManager Review Fork AgentPool background_review turn_finalizer LLM Provider ToolManager Review Fork AgentPool background_review turn_finalizer #mermaid-svg-ZGrawXfQ53BE5FmW{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZGrawXfQ53BE5FmW .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZGrawXfQ53BE5FmW .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZGrawXfQ53BE5FmW .error-icon{fill:#552222;}#mermaid-svg-ZGrawXfQ53BE5FmW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZGrawXfQ53BE5FmW .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZGrawXfQ53BE5FmW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZGrawXfQ53BE5FmW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZGrawXfQ53BE5FmW .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZGrawXfQ53BE5FmW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZGrawXfQ53BE5FmW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZGrawXfQ53BE5FmW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZGrawXfQ53BE5FmW .marker.cross{stroke:#333333;}#mermaid-svg-ZGrawXfQ53BE5FmW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZGrawXfQ53BE5FmW p{margin:0;}#mermaid-svg-ZGrawXfQ53BE5FmW .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ZGrawXfQ53BE5FmW text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-ZGrawXfQ53BE5FmW .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-ZGrawXfQ53BE5FmW .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-ZGrawXfQ53BE5FmW .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-ZGrawXfQ53BE5FmW .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-ZGrawXfQ53BE5FmW #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-ZGrawXfQ53BE5FmW .sequenceNumber{fill:white;}#mermaid-svg-ZGrawXfQ53BE5FmW #sequencenumber{fill:#333;}#mermaid-svg-ZGrawXfQ53BE5FmW #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-ZGrawXfQ53BE5FmW .messageText{fill:#333;stroke:none;}#mermaid-svg-ZGrawXfQ53BE5FmW .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ZGrawXfQ53BE5FmW .labelText,#mermaid-svg-ZGrawXfQ53BE5FmW .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-ZGrawXfQ53BE5FmW .loopText,#mermaid-svg-ZGrawXfQ53BE5FmW .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-ZGrawXfQ53BE5FmW .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-ZGrawXfQ53BE5FmW .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-ZGrawXfQ53BE5FmW .noteText,#mermaid-svg-ZGrawXfQ53BE5FmW .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-ZGrawXfQ53BE5FmW .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ZGrawXfQ53BE5FmW .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ZGrawXfQ53BE5FmW .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-ZGrawXfQ53BE5FmW .actorPopupMenu{position:absolute;}#mermaid-svg-ZGrawXfQ53BE5FmW .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-ZGrawXfQ53BE5FmW .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-ZGrawXfQ53BE5FmW .actor-man circle,#mermaid-svg-ZGrawXfQ53BE5FmW line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-ZGrawXfQ53BE5FmW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1. 构建审查提示词_build_review_prompt()含会话摘要 + 信号清单 _spawn_background_review()prepare_background_review_run()2. 选择审查提示词_SKILL_REVIEW_PROMPT_MEMORY_REVIEW_PROMPT_COMBINED_REVIEW_PROMPT3. acquire_fork(parent_agent)复制 agent 配置(model, provider, credentials)复制 session_id(缓存前缀对齐)4. 构建受限工具集过滤 tools\[\]仅保留白名单工具受限 ToolManagercache_parity_fork5. run_conversation(review_prompt)发送审查请求(系统提示词 = 父代理的)审查决策skill_manage(patch) / memory(add)写入结果审查完成 + action_summary6. 格式化用户通知"💾 Self-improvement review: ..."审查完成

3.3 工具白名单:最小权限原则

审查 fork 只拥有三个工具,这是最小权限原则的体现:

工具 用途 权限范围
skill_manage 创建/修补/编辑技能 读写 ~/.hermes/skills/
memory 添加/替换记忆 读写 ~/.hermes/memories/
read_file 读取会话相关文件 只读,用于审查上下文

审查 fork 没有 bash、write_file、edit_file、web_fetch 等工具。这意味着即使审查 LLM 产生幻觉或被注入恶意指令,它也只能写入技能和记忆文件------无法执行命令、无法修改系统文件、无法访问网络。这是一个关键的安全边界。

3.4 取消机制

审查 fork 是可取消的 。当用户在审查进行中发送新消息时,系统会通过 cancel_event 通知审查 fork 中止:
#mermaid-svg-prgyDKB8MMuTOD9K{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-prgyDKB8MMuTOD9K .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-prgyDKB8MMuTOD9K .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-prgyDKB8MMuTOD9K .error-icon{fill:#552222;}#mermaid-svg-prgyDKB8MMuTOD9K .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-prgyDKB8MMuTOD9K .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-prgyDKB8MMuTOD9K .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-prgyDKB8MMuTOD9K .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-prgyDKB8MMuTOD9K .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-prgyDKB8MMuTOD9K .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-prgyDKB8MMuTOD9K .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-prgyDKB8MMuTOD9K .marker{fill:#333333;stroke:#333333;}#mermaid-svg-prgyDKB8MMuTOD9K .marker.cross{stroke:#333333;}#mermaid-svg-prgyDKB8MMuTOD9K svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-prgyDKB8MMuTOD9K p{margin:0;}#mermaid-svg-prgyDKB8MMuTOD9K .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-prgyDKB8MMuTOD9K .cluster-label text{fill:#333;}#mermaid-svg-prgyDKB8MMuTOD9K .cluster-label span{color:#333;}#mermaid-svg-prgyDKB8MMuTOD9K .cluster-label span p{background-color:transparent;}#mermaid-svg-prgyDKB8MMuTOD9K .label text,#mermaid-svg-prgyDKB8MMuTOD9K span{fill:#333;color:#333;}#mermaid-svg-prgyDKB8MMuTOD9K .node rect,#mermaid-svg-prgyDKB8MMuTOD9K .node circle,#mermaid-svg-prgyDKB8MMuTOD9K .node ellipse,#mermaid-svg-prgyDKB8MMuTOD9K .node polygon,#mermaid-svg-prgyDKB8MMuTOD9K .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-prgyDKB8MMuTOD9K .rough-node .label text,#mermaid-svg-prgyDKB8MMuTOD9K .node .label text,#mermaid-svg-prgyDKB8MMuTOD9K .image-shape .label,#mermaid-svg-prgyDKB8MMuTOD9K .icon-shape .label{text-anchor:middle;}#mermaid-svg-prgyDKB8MMuTOD9K .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-prgyDKB8MMuTOD9K .rough-node .label,#mermaid-svg-prgyDKB8MMuTOD9K .node .label,#mermaid-svg-prgyDKB8MMuTOD9K .image-shape .label,#mermaid-svg-prgyDKB8MMuTOD9K .icon-shape .label{text-align:center;}#mermaid-svg-prgyDKB8MMuTOD9K .node.clickable{cursor:pointer;}#mermaid-svg-prgyDKB8MMuTOD9K .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-prgyDKB8MMuTOD9K .arrowheadPath{fill:#333333;}#mermaid-svg-prgyDKB8MMuTOD9K .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-prgyDKB8MMuTOD9K .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-prgyDKB8MMuTOD9K .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-prgyDKB8MMuTOD9K .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-prgyDKB8MMuTOD9K .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-prgyDKB8MMuTOD9K .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-prgyDKB8MMuTOD9K .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-prgyDKB8MMuTOD9K .cluster text{fill:#333;}#mermaid-svg-prgyDKB8MMuTOD9K .cluster span{color:#333;}#mermaid-svg-prgyDKB8MMuTOD9K div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-prgyDKB8MMuTOD9K .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-prgyDKB8MMuTOD9K rect.text{fill:none;stroke-width:0;}#mermaid-svg-prgyDKB8MMuTOD9K .icon-shape,#mermaid-svg-prgyDKB8MMuTOD9K .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-prgyDKB8MMuTOD9K .icon-shape p,#mermaid-svg-prgyDKB8MMuTOD9K .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-prgyDKB8MMuTOD9K .icon-shape .label rect,#mermaid-svg-prgyDKB8MMuTOD9K .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-prgyDKB8MMuTOD9K .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-prgyDKB8MMuTOD9K .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-prgyDKB8MMuTOD9K :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
已取消
未取消
用户发送新消息
后台审查进行中?
设置 cancel_event
正常处理新消息
审查 fork 检查 cancel_event
中止审查

保留已写入的部分结果
继续审查
清理 fork 资源

这个设计确保了用户交互永远优先于后台审查。审查不会阻塞用户的下一轮对话,也不会因为用户快速连续发消息而堆积------每次新消息都会取消正在进行的审查。

3.5 空闲队列门控

除了 nudge 计数器触发外,系统还有一个空闲队列 机制(review_idle_queue.py),用于在系统空闲时补跑被取消的审查:
#mermaid-svg-HVdbl4yCKYTLyqbR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-HVdbl4yCKYTLyqbR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-HVdbl4yCKYTLyqbR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-HVdbl4yCKYTLyqbR .error-icon{fill:#552222;}#mermaid-svg-HVdbl4yCKYTLyqbR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HVdbl4yCKYTLyqbR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-HVdbl4yCKYTLyqbR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HVdbl4yCKYTLyqbR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HVdbl4yCKYTLyqbR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-HVdbl4yCKYTLyqbR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HVdbl4yCKYTLyqbR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HVdbl4yCKYTLyqbR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HVdbl4yCKYTLyqbR .marker.cross{stroke:#333333;}#mermaid-svg-HVdbl4yCKYTLyqbR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HVdbl4yCKYTLyqbR p{margin:0;}#mermaid-svg-HVdbl4yCKYTLyqbR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-HVdbl4yCKYTLyqbR .cluster-label text{fill:#333;}#mermaid-svg-HVdbl4yCKYTLyqbR .cluster-label span{color:#333;}#mermaid-svg-HVdbl4yCKYTLyqbR .cluster-label span p{background-color:transparent;}#mermaid-svg-HVdbl4yCKYTLyqbR .label text,#mermaid-svg-HVdbl4yCKYTLyqbR span{fill:#333;color:#333;}#mermaid-svg-HVdbl4yCKYTLyqbR .node rect,#mermaid-svg-HVdbl4yCKYTLyqbR .node circle,#mermaid-svg-HVdbl4yCKYTLyqbR .node ellipse,#mermaid-svg-HVdbl4yCKYTLyqbR .node polygon,#mermaid-svg-HVdbl4yCKYTLyqbR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HVdbl4yCKYTLyqbR .rough-node .label text,#mermaid-svg-HVdbl4yCKYTLyqbR .node .label text,#mermaid-svg-HVdbl4yCKYTLyqbR .image-shape .label,#mermaid-svg-HVdbl4yCKYTLyqbR .icon-shape .label{text-anchor:middle;}#mermaid-svg-HVdbl4yCKYTLyqbR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-HVdbl4yCKYTLyqbR .rough-node .label,#mermaid-svg-HVdbl4yCKYTLyqbR .node .label,#mermaid-svg-HVdbl4yCKYTLyqbR .image-shape .label,#mermaid-svg-HVdbl4yCKYTLyqbR .icon-shape .label{text-align:center;}#mermaid-svg-HVdbl4yCKYTLyqbR .node.clickable{cursor:pointer;}#mermaid-svg-HVdbl4yCKYTLyqbR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-HVdbl4yCKYTLyqbR .arrowheadPath{fill:#333333;}#mermaid-svg-HVdbl4yCKYTLyqbR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-HVdbl4yCKYTLyqbR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-HVdbl4yCKYTLyqbR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HVdbl4yCKYTLyqbR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-HVdbl4yCKYTLyqbR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HVdbl4yCKYTLyqbR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-HVdbl4yCKYTLyqbR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-HVdbl4yCKYTLyqbR .cluster text{fill:#333;}#mermaid-svg-HVdbl4yCKYTLyqbR .cluster span{color:#333;}#mermaid-svg-HVdbl4yCKYTLyqbR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-HVdbl4yCKYTLyqbR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-HVdbl4yCKYTLyqbR rect.text{fill:none;stroke-width:0;}#mermaid-svg-HVdbl4yCKYTLyqbR .icon-shape,#mermaid-svg-HVdbl4yCKYTLyqbR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HVdbl4yCKYTLyqbR .icon-shape p,#mermaid-svg-HVdbl4yCKYTLyqbR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-HVdbl4yCKYTLyqbR .icon-shape .label rect,#mermaid-svg-HVdbl4yCKYTLyqbR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HVdbl4yCKYTLyqbR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-HVdbl4yCKYTLyqbR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-HVdbl4yCKYTLyqbR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 空闲队列工作流
是
否
审查被取消

或未触发
加入 idle_queue
系统空闲?

(无用户消息

等待中)
从 idle_queue 取出
继续等待
补跑审查
审查完成

这确保了即使审查因为用户快速发消息而被取消,学习机会也不会永久丢失------系统会在空闲时补跑。


四、审查提示词深度解析

审查提示词是整个自我进化系统的"大脑"------它决定了 fork 代理如何评估会话、提取什么信号、做出什么决策。background_review.py 中定义了三套提示词,分别用于技能审查、记忆审查和联合审查。

4.1 三套审查提示词

#mermaid-svg-Ipg5m4pQ4ImOo9Ie{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .error-icon{fill:#552222;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .marker.cross{stroke:#333333;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie p{margin:0;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .cluster-label text{fill:#333;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .cluster-label span{color:#333;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .cluster-label span p{background-color:transparent;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .label text,#mermaid-svg-Ipg5m4pQ4ImOo9Ie span{fill:#333;color:#333;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .node rect,#mermaid-svg-Ipg5m4pQ4ImOo9Ie .node circle,#mermaid-svg-Ipg5m4pQ4ImOo9Ie .node ellipse,#mermaid-svg-Ipg5m4pQ4ImOo9Ie .node polygon,#mermaid-svg-Ipg5m4pQ4ImOo9Ie .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .rough-node .label text,#mermaid-svg-Ipg5m4pQ4ImOo9Ie .node .label text,#mermaid-svg-Ipg5m4pQ4ImOo9Ie .image-shape .label,#mermaid-svg-Ipg5m4pQ4ImOo9Ie .icon-shape .label{text-anchor:middle;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .rough-node .label,#mermaid-svg-Ipg5m4pQ4ImOo9Ie .node .label,#mermaid-svg-Ipg5m4pQ4ImOo9Ie .image-shape .label,#mermaid-svg-Ipg5m4pQ4ImOo9Ie .icon-shape .label{text-align:center;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .node.clickable{cursor:pointer;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .arrowheadPath{fill:#333333;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .cluster text{fill:#333;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .cluster span{color:#333;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie rect.text{fill:none;stroke-width:0;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .icon-shape,#mermaid-svg-Ipg5m4pQ4ImOo9Ie .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .icon-shape p,#mermaid-svg-Ipg5m4pQ4ImOo9Ie .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .icon-shape .label rect,#mermaid-svg-Ipg5m4pQ4ImOo9Ie .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Ipg5m4pQ4ImOo9Ie :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 记忆审查关注
技能审查关注
提示词选择逻辑
仅技能
仅记忆
两者都需要
需要审查什么?
_SKILL_REVIEW_PROMPT

技能专用审查
_MEMORY_REVIEW_PROMPT

记忆专用审查
_COMBINED_REVIEW_PROMPT

联合审查
工作流程是否可复用?
工具使用模式是否值得固化?
执行顺序是否有规律?
用户对结果有明确偏好?
是否踩了耗时的坑?
用户身份信息

(姓名, 角色, 团队)
用户偏好

(语言, 风格, 格式)
当前操作状态

(项目, 分支, 任务)
环境上下文

(OS, 工具链, 配置)

4.2 _LESSON_LAYER_BLOCK:课程层

审查提示词中包含一个特殊的 _LESSON_LAYER_BLOCK,它指导审查代理如何从会话中提取"课程"------即那些不是具体技能但值得记录的经验教训:

  • 什么构成课程:调试过程中的发现、工具的意外行为、配置的陷阱、性能的瓶颈
  • 什么不构成课程:一次性的操作结果、用户的一次性偏好、已经存在于技能中的知识
  • 课程的存储位置 :作为技能的 supporting 文件(如 LESSONS.md),而非独立技能

4.3 _DO_NOT_CAPTURE_BLOCK:禁止捕获

这是审查提示词中最重要的安全约束块。它明确列出了审查代理绝不能捕获和存储的内容:

禁止捕获类别 原因 示例
敏感凭证 安全风险 API keys, passwords, tokens
临时文件内容 无复用价值 /tmp 下的中间文件
用户私密信息 隐私保护 个人通信, 健康信息
错误的尝试 避免固化错误 失败的调试路径
一次性上下文 无泛化价值 特定文件的特定行号

4.4 审查信号清单

审查提示词会向 fork 代理提供一份信号清单,帮助它从会话中识别值得固化的模式:
#mermaid-svg-C7UCBRqp52lUe1uR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-C7UCBRqp52lUe1uR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-C7UCBRqp52lUe1uR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-C7UCBRqp52lUe1uR .error-icon{fill:#552222;}#mermaid-svg-C7UCBRqp52lUe1uR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-C7UCBRqp52lUe1uR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-C7UCBRqp52lUe1uR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-C7UCBRqp52lUe1uR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-C7UCBRqp52lUe1uR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-C7UCBRqp52lUe1uR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-C7UCBRqp52lUe1uR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-C7UCBRqp52lUe1uR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-C7UCBRqp52lUe1uR .marker.cross{stroke:#333333;}#mermaid-svg-C7UCBRqp52lUe1uR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-C7UCBRqp52lUe1uR p{margin:0;}#mermaid-svg-C7UCBRqp52lUe1uR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-C7UCBRqp52lUe1uR .cluster-label text{fill:#333;}#mermaid-svg-C7UCBRqp52lUe1uR .cluster-label span{color:#333;}#mermaid-svg-C7UCBRqp52lUe1uR .cluster-label span p{background-color:transparent;}#mermaid-svg-C7UCBRqp52lUe1uR .label text,#mermaid-svg-C7UCBRqp52lUe1uR span{fill:#333;color:#333;}#mermaid-svg-C7UCBRqp52lUe1uR .node rect,#mermaid-svg-C7UCBRqp52lUe1uR .node circle,#mermaid-svg-C7UCBRqp52lUe1uR .node ellipse,#mermaid-svg-C7UCBRqp52lUe1uR .node polygon,#mermaid-svg-C7UCBRqp52lUe1uR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-C7UCBRqp52lUe1uR .rough-node .label text,#mermaid-svg-C7UCBRqp52lUe1uR .node .label text,#mermaid-svg-C7UCBRqp52lUe1uR .image-shape .label,#mermaid-svg-C7UCBRqp52lUe1uR .icon-shape .label{text-anchor:middle;}#mermaid-svg-C7UCBRqp52lUe1uR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-C7UCBRqp52lUe1uR .rough-node .label,#mermaid-svg-C7UCBRqp52lUe1uR .node .label,#mermaid-svg-C7UCBRqp52lUe1uR .image-shape .label,#mermaid-svg-C7UCBRqp52lUe1uR .icon-shape .label{text-align:center;}#mermaid-svg-C7UCBRqp52lUe1uR .node.clickable{cursor:pointer;}#mermaid-svg-C7UCBRqp52lUe1uR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-C7UCBRqp52lUe1uR .arrowheadPath{fill:#333333;}#mermaid-svg-C7UCBRqp52lUe1uR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-C7UCBRqp52lUe1uR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-C7UCBRqp52lUe1uR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-C7UCBRqp52lUe1uR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-C7UCBRqp52lUe1uR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-C7UCBRqp52lUe1uR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-C7UCBRqp52lUe1uR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-C7UCBRqp52lUe1uR .cluster text{fill:#333;}#mermaid-svg-C7UCBRqp52lUe1uR .cluster span{color:#333;}#mermaid-svg-C7UCBRqp52lUe1uR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-C7UCBRqp52lUe1uR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-C7UCBRqp52lUe1uR rect.text{fill:none;stroke-width:0;}#mermaid-svg-C7UCBRqp52lUe1uR .icon-shape,#mermaid-svg-C7UCBRqp52lUe1uR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-C7UCBRqp52lUe1uR .icon-shape p,#mermaid-svg-C7UCBRqp52lUe1uR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-C7UCBRqp52lUe1uR .icon-shape .label rect,#mermaid-svg-C7UCBRqp52lUe1uR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-C7UCBRqp52lUe1uR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-C7UCBRqp52lUe1uR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-C7UCBRqp52lUe1uR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 噪声信号 (应忽略)
❌ 一次性的文件内容
❌ 临时调试输出
❌ 已有技能覆盖的模式
❌ 用户的一次性请求

无泛化价值
记忆信号 (触发记忆更新)
✅ 用户透露了身份信息
✅ 用户表达了持久偏好
✅ 用户说明了当前项目/任务
✅ 环境信息有助于

未来会话
技能信号 (触发技能创建/更新)
✅ 代理使用了特定工具组合

完成一类任务
✅ 代理执行了明确的步骤序列

且有成功结果
✅ 用户对结果表达了偏好

(太长/太短/格式不对)
✅ 代理踩了坑并自行纠正

(耗时陷阱)
✅ 代理发现了更优的工具

使用方式

4.5 审查输出格式

审查代理的输出不是自由文本,而是结构化的动作摘要 。fork 代理通过工具调用(skill_manage 和 memory)来执行写入,每次写入都会返回一个动作记录,最终汇总为用户可见的通知:

复制代码
💾 Self-improvement review:
  • Updated skill "python-testing" (patched: added pytest fixture pattern)
  • Added memory: user prefers type hints in Python code
  • No skill changes needed for this session

这个通知是用户感知到自我进化系统工作的唯一窗口------它简洁、透明、可审计。


五、技能生命周期

技能不是静态的文件------它们有完整的生命周期,从创建到活跃使用,到逐渐过时,再到归档或合并。这个生命周期由 tools/skill_usage.py 中的状态机和 agent/curator.py 中的策展器共同管理。

5.1 技能状态机

#mermaid-svg-OqRh27I0EeGaVFGo{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OqRh27I0EeGaVFGo .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OqRh27I0EeGaVFGo .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OqRh27I0EeGaVFGo .error-icon{fill:#552222;}#mermaid-svg-OqRh27I0EeGaVFGo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OqRh27I0EeGaVFGo .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OqRh27I0EeGaVFGo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OqRh27I0EeGaVFGo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OqRh27I0EeGaVFGo .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OqRh27I0EeGaVFGo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OqRh27I0EeGaVFGo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OqRh27I0EeGaVFGo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OqRh27I0EeGaVFGo .marker.cross{stroke:#333333;}#mermaid-svg-OqRh27I0EeGaVFGo svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OqRh27I0EeGaVFGo p{margin:0;}#mermaid-svg-OqRh27I0EeGaVFGo defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-OqRh27I0EeGaVFGo g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-OqRh27I0EeGaVFGo g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-OqRh27I0EeGaVFGo g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-OqRh27I0EeGaVFGo g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-OqRh27I0EeGaVFGo g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-OqRh27I0EeGaVFGo .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-OqRh27I0EeGaVFGo .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-OqRh27I0EeGaVFGo .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-OqRh27I0EeGaVFGo .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-OqRh27I0EeGaVFGo .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-OqRh27I0EeGaVFGo .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-OqRh27I0EeGaVFGo .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-OqRh27I0EeGaVFGo .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OqRh27I0EeGaVFGo .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OqRh27I0EeGaVFGo .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OqRh27I0EeGaVFGo .edgeLabel .label text{fill:#333;}#mermaid-svg-OqRh27I0EeGaVFGo .label div .edgeLabel{color:#333;}#mermaid-svg-OqRh27I0EeGaVFGo .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-OqRh27I0EeGaVFGo .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-OqRh27I0EeGaVFGo .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-OqRh27I0EeGaVFGo .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-OqRh27I0EeGaVFGo .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-OqRh27I0EeGaVFGo .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OqRh27I0EeGaVFGo .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OqRh27I0EeGaVFGo #statediagram-barbEnd{fill:#333333;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OqRh27I0EeGaVFGo .cluster-label,#mermaid-svg-OqRh27I0EeGaVFGo .nodeLabel{color:#131300;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-OqRh27I0EeGaVFGo .note-edge{stroke-dasharray:5;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagram-note text{fill:black;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagram-note .nodeLabel{color:black;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagram .edgeLabel{color:red;}#mermaid-svg-OqRh27I0EeGaVFGo #dependencyStart,#mermaid-svg-OqRh27I0EeGaVFGo #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-OqRh27I0EeGaVFGo .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OqRh27I0EeGaVFGo :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} create / learn
bump_used (使用)
超过 stale_after_days

未被使用
bump_used (重新使用)
超过 archive_after_days

未被使用
restore (用户恢复)
delete (用户删除)
用户手动抑制

suppress_skill()
unsuppress_skill()
delete
active
stale
archived
suppressed

5.2 bump 函数族:使用遥测

每次代理在会话中使用 一个技能(通过 skill_search 找到并加载),都会调用 bump_used() 更新使用计数器。这是技能状态机的核心驱动力:
#mermaid-svg-A1wLgy2YqcKRPefO{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-A1wLgy2YqcKRPefO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-A1wLgy2YqcKRPefO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-A1wLgy2YqcKRPefO .error-icon{fill:#552222;}#mermaid-svg-A1wLgy2YqcKRPefO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-A1wLgy2YqcKRPefO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-A1wLgy2YqcKRPefO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-A1wLgy2YqcKRPefO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-A1wLgy2YqcKRPefO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-A1wLgy2YqcKRPefO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-A1wLgy2YqcKRPefO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-A1wLgy2YqcKRPefO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-A1wLgy2YqcKRPefO .marker.cross{stroke:#333333;}#mermaid-svg-A1wLgy2YqcKRPefO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-A1wLgy2YqcKRPefO p{margin:0;}#mermaid-svg-A1wLgy2YqcKRPefO .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-A1wLgy2YqcKRPefO .cluster-label text{fill:#333;}#mermaid-svg-A1wLgy2YqcKRPefO .cluster-label span{color:#333;}#mermaid-svg-A1wLgy2YqcKRPefO .cluster-label span p{background-color:transparent;}#mermaid-svg-A1wLgy2YqcKRPefO .label text,#mermaid-svg-A1wLgy2YqcKRPefO span{fill:#333;color:#333;}#mermaid-svg-A1wLgy2YqcKRPefO .node rect,#mermaid-svg-A1wLgy2YqcKRPefO .node circle,#mermaid-svg-A1wLgy2YqcKRPefO .node ellipse,#mermaid-svg-A1wLgy2YqcKRPefO .node polygon,#mermaid-svg-A1wLgy2YqcKRPefO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-A1wLgy2YqcKRPefO .rough-node .label text,#mermaid-svg-A1wLgy2YqcKRPefO .node .label text,#mermaid-svg-A1wLgy2YqcKRPefO .image-shape .label,#mermaid-svg-A1wLgy2YqcKRPefO .icon-shape .label{text-anchor:middle;}#mermaid-svg-A1wLgy2YqcKRPefO .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-A1wLgy2YqcKRPefO .rough-node .label,#mermaid-svg-A1wLgy2YqcKRPefO .node .label,#mermaid-svg-A1wLgy2YqcKRPefO .image-shape .label,#mermaid-svg-A1wLgy2YqcKRPefO .icon-shape .label{text-align:center;}#mermaid-svg-A1wLgy2YqcKRPefO .node.clickable{cursor:pointer;}#mermaid-svg-A1wLgy2YqcKRPefO .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-A1wLgy2YqcKRPefO .arrowheadPath{fill:#333333;}#mermaid-svg-A1wLgy2YqcKRPefO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-A1wLgy2YqcKRPefO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-A1wLgy2YqcKRPefO .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-A1wLgy2YqcKRPefO .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-A1wLgy2YqcKRPefO .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-A1wLgy2YqcKRPefO .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-A1wLgy2YqcKRPefO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-A1wLgy2YqcKRPefO .cluster text{fill:#333;}#mermaid-svg-A1wLgy2YqcKRPefO .cluster span{color:#333;}#mermaid-svg-A1wLgy2YqcKRPefO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-A1wLgy2YqcKRPefO .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-A1wLgy2YqcKRPefO rect.text{fill:none;stroke-width:0;}#mermaid-svg-A1wLgy2YqcKRPefO .icon-shape,#mermaid-svg-A1wLgy2YqcKRPefO .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-A1wLgy2YqcKRPefO .icon-shape p,#mermaid-svg-A1wLgy2YqcKRPefO .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-A1wLgy2YqcKRPefO .icon-shape .label rect,#mermaid-svg-A1wLgy2YqcKRPefO .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-A1wLgy2YqcKRPefO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-A1wLgy2YqcKRPefO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-A1wLgy2YqcKRPefO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} bump_used() 流程
stale
active
archived
代理调用 skill_search
返回匹配技能
代理在会话中使用技能
turn_finalizer 调用

bump_used(skill_name)
更新 usage.json:

used_count += 1

last_used = now()
当前状态?
状态转回 active

复活
保持 active
不 bump

(归档技能不参与)

关键设计:

  1. used_count 是累积的 :不会因为状态转换而重置。一个技能被使用 100 次后变为 stale,再被使用时 used_count 变为 101,状态恢复 active。
  2. last_used 是状态转换的时钟 :stale_after_days 和 archive_after_days 都基于 last_used 计算。默认值分别为 30 天和 90 天。
  3. 归档技能不 bump:一旦技能进入 archived 状态,即使代理 somehow 引用了它,也不会 bump。归档是"终态"------除非用户显式 restore。

5.3 suppressed_names:用户抑制

用户可以通过 suppress_skill() 主动抑制一个技能------被抑制的技能不会出现在 skill_search 的结果中,但文件仍然保留。这是用户对自我进化系统的否决权:
#mermaid-svg-PSQVR3gq4Py28jiB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PSQVR3gq4Py28jiB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PSQVR3gq4Py28jiB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PSQVR3gq4Py28jiB .error-icon{fill:#552222;}#mermaid-svg-PSQVR3gq4Py28jiB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PSQVR3gq4Py28jiB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PSQVR3gq4Py28jiB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PSQVR3gq4Py28jiB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PSQVR3gq4Py28jiB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PSQVR3gq4Py28jiB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PSQVR3gq4Py28jiB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PSQVR3gq4Py28jiB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PSQVR3gq4Py28jiB .marker.cross{stroke:#333333;}#mermaid-svg-PSQVR3gq4Py28jiB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PSQVR3gq4Py28jiB p{margin:0;}#mermaid-svg-PSQVR3gq4Py28jiB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PSQVR3gq4Py28jiB .cluster-label text{fill:#333;}#mermaid-svg-PSQVR3gq4Py28jiB .cluster-label span{color:#333;}#mermaid-svg-PSQVR3gq4Py28jiB .cluster-label span p{background-color:transparent;}#mermaid-svg-PSQVR3gq4Py28jiB .label text,#mermaid-svg-PSQVR3gq4Py28jiB span{fill:#333;color:#333;}#mermaid-svg-PSQVR3gq4Py28jiB .node rect,#mermaid-svg-PSQVR3gq4Py28jiB .node circle,#mermaid-svg-PSQVR3gq4Py28jiB .node ellipse,#mermaid-svg-PSQVR3gq4Py28jiB .node polygon,#mermaid-svg-PSQVR3gq4Py28jiB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PSQVR3gq4Py28jiB .rough-node .label text,#mermaid-svg-PSQVR3gq4Py28jiB .node .label text,#mermaid-svg-PSQVR3gq4Py28jiB .image-shape .label,#mermaid-svg-PSQVR3gq4Py28jiB .icon-shape .label{text-anchor:middle;}#mermaid-svg-PSQVR3gq4Py28jiB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PSQVR3gq4Py28jiB .rough-node .label,#mermaid-svg-PSQVR3gq4Py28jiB .node .label,#mermaid-svg-PSQVR3gq4Py28jiB .image-shape .label,#mermaid-svg-PSQVR3gq4Py28jiB .icon-shape .label{text-align:center;}#mermaid-svg-PSQVR3gq4Py28jiB .node.clickable{cursor:pointer;}#mermaid-svg-PSQVR3gq4Py28jiB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PSQVR3gq4Py28jiB .arrowheadPath{fill:#333333;}#mermaid-svg-PSQVR3gq4Py28jiB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PSQVR3gq4Py28jiB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PSQVR3gq4Py28jiB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PSQVR3gq4Py28jiB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PSQVR3gq4Py28jiB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PSQVR3gq4Py28jiB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PSQVR3gq4Py28jiB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PSQVR3gq4Py28jiB .cluster text{fill:#333;}#mermaid-svg-PSQVR3gq4Py28jiB .cluster span{color:#333;}#mermaid-svg-PSQVR3gq4Py28jiB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PSQVR3gq4Py28jiB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PSQVR3gq4Py28jiB rect.text{fill:none;stroke-width:0;}#mermaid-svg-PSQVR3gq4Py28jiB .icon-shape,#mermaid-svg-PSQVR3gq4Py28jiB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PSQVR3gq4Py28jiB .icon-shape p,#mermaid-svg-PSQVR3gq4Py28jiB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PSQVR3gq4Py28jiB .icon-shape .label rect,#mermaid-svg-PSQVR3gq4Py28jiB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PSQVR3gq4Py28jiB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PSQVR3gq4Py28jiB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PSQVR3gq4Py28jiB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 恢复机制
用户: unsuppress_skill('xxx')
从 suppressed_names 移除
技能重新参与搜索
抑制机制
用户: suppress_skill('xxx')
加入 suppressed_names
skill_search 过滤

被抑制技能不出现在结果中
技能文件保留

可随时恢复

5.4 provenance:技能来源追踪

每个技能都记录了其 provenance (来源信息),包括创建方式、创建时间、最后修改时间、来源会话 ID 等。这使得每个技能都是可审计的------你可以追溯任何技能是从哪次会话中学习来的,或者是用户手动创建的。

provenance 字段 含义 示例值
created_by 创建方式 background_review, /learn, manual
created_at 创建时间 ISO 8601 时间戳
last_modified 最后修改时间 ISO 8601 时间戳
source_session 来源会话 session_id
consolidation_count 被合并次数 整数

六、技能使用遥测系统

技能使用遥测是自我进化系统的"感觉器官"------它持续监控每个技能的使用情况,为状态机和策展器提供数据基础。tools/skill_usage.py 实现了完整的遥测系统。

6.1 usage.json 结构

每个技能目录下都有一个 usage.json 文件,记录该技能的使用遥测数据:

json 复制代码
{
  "used_count": 42,
  "last_used": "2026-09-28T14:30:00Z",
  "created_at": "2026-08-15T10:00:00Z",
  "status": "active",
  "stale_after_days": 30,
  "archive_after_days": 90,
  "provenance": {
    "created_by": "background_review",
    "source_session": "sess_abc123",
    "consolidation_count": 0
  },
  "suppressed": false,
  "last_bumped_by": "turn_finalizer"
}

6.2 遥测数据流

#mermaid-svg-0Mw1APkfQlDiUauB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0Mw1APkfQlDiUauB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0Mw1APkfQlDiUauB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0Mw1APkfQlDiUauB .error-icon{fill:#552222;}#mermaid-svg-0Mw1APkfQlDiUauB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0Mw1APkfQlDiUauB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0Mw1APkfQlDiUauB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0Mw1APkfQlDiUauB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0Mw1APkfQlDiUauB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0Mw1APkfQlDiUauB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0Mw1APkfQlDiUauB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0Mw1APkfQlDiUauB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0Mw1APkfQlDiUauB .marker.cross{stroke:#333333;}#mermaid-svg-0Mw1APkfQlDiUauB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0Mw1APkfQlDiUauB p{margin:0;}#mermaid-svg-0Mw1APkfQlDiUauB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0Mw1APkfQlDiUauB .cluster-label text{fill:#333;}#mermaid-svg-0Mw1APkfQlDiUauB .cluster-label span{color:#333;}#mermaid-svg-0Mw1APkfQlDiUauB .cluster-label span p{background-color:transparent;}#mermaid-svg-0Mw1APkfQlDiUauB .label text,#mermaid-svg-0Mw1APkfQlDiUauB span{fill:#333;color:#333;}#mermaid-svg-0Mw1APkfQlDiUauB .node rect,#mermaid-svg-0Mw1APkfQlDiUauB .node circle,#mermaid-svg-0Mw1APkfQlDiUauB .node ellipse,#mermaid-svg-0Mw1APkfQlDiUauB .node polygon,#mermaid-svg-0Mw1APkfQlDiUauB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0Mw1APkfQlDiUauB .rough-node .label text,#mermaid-svg-0Mw1APkfQlDiUauB .node .label text,#mermaid-svg-0Mw1APkfQlDiUauB .image-shape .label,#mermaid-svg-0Mw1APkfQlDiUauB .icon-shape .label{text-anchor:middle;}#mermaid-svg-0Mw1APkfQlDiUauB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0Mw1APkfQlDiUauB .rough-node .label,#mermaid-svg-0Mw1APkfQlDiUauB .node .label,#mermaid-svg-0Mw1APkfQlDiUauB .image-shape .label,#mermaid-svg-0Mw1APkfQlDiUauB .icon-shape .label{text-align:center;}#mermaid-svg-0Mw1APkfQlDiUauB .node.clickable{cursor:pointer;}#mermaid-svg-0Mw1APkfQlDiUauB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0Mw1APkfQlDiUauB .arrowheadPath{fill:#333333;}#mermaid-svg-0Mw1APkfQlDiUauB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0Mw1APkfQlDiUauB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0Mw1APkfQlDiUauB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0Mw1APkfQlDiUauB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0Mw1APkfQlDiUauB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0Mw1APkfQlDiUauB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0Mw1APkfQlDiUauB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0Mw1APkfQlDiUauB .cluster text{fill:#333;}#mermaid-svg-0Mw1APkfQlDiUauB .cluster span{color:#333;}#mermaid-svg-0Mw1APkfQlDiUauB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0Mw1APkfQlDiUauB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0Mw1APkfQlDiUauB rect.text{fill:none;stroke-width:0;}#mermaid-svg-0Mw1APkfQlDiUauB .icon-shape,#mermaid-svg-0Mw1APkfQlDiUauB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0Mw1APkfQlDiUauB .icon-shape p,#mermaid-svg-0Mw1APkfQlDiUauB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0Mw1APkfQlDiUauB .icon-shape .label rect,#mermaid-svg-0Mw1APkfQlDiUauB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0Mw1APkfQlDiUauB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0Mw1APkfQlDiUauB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0Mw1APkfQlDiUauB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 遥测数据消费
遥测数据采集
代理调用 skill_search
返回匹配技能列表
代理使用技能执行任务
轮次结束
turn_finalizer

遍历已使用技能
bump_used(skill_name)

更新 usage.json
状态机

判断 stale/archived
策展器

判断合并候选
洞察引擎

聚合统计
学习图谱

密度计算

6.3 状态转换的纯函数判定

状态转换不是由 LLM 决定的,而是由纯函数 决定的------这是"核心窄,能力在边缘"原则的体现。状态转换逻辑在 skill_usage.py 中实现,完全基于 usage.json 中的数值字段:
#mermaid-svg-SYDrjOyujcpdvuON{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SYDrjOyujcpdvuON .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SYDrjOyujcpdvuON .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SYDrjOyujcpdvuON .error-icon{fill:#552222;}#mermaid-svg-SYDrjOyujcpdvuON .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SYDrjOyujcpdvuON .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SYDrjOyujcpdvuON .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SYDrjOyujcpdvuON .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SYDrjOyujcpdvuON .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SYDrjOyujcpdvuON .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SYDrjOyujcpdvuON .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SYDrjOyujcpdvuON .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SYDrjOyujcpdvuON .marker.cross{stroke:#333333;}#mermaid-svg-SYDrjOyujcpdvuON svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SYDrjOyujcpdvuON p{margin:0;}#mermaid-svg-SYDrjOyujcpdvuON .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SYDrjOyujcpdvuON .cluster-label text{fill:#333;}#mermaid-svg-SYDrjOyujcpdvuON .cluster-label span{color:#333;}#mermaid-svg-SYDrjOyujcpdvuON .cluster-label span p{background-color:transparent;}#mermaid-svg-SYDrjOyujcpdvuON .label text,#mermaid-svg-SYDrjOyujcpdvuON span{fill:#333;color:#333;}#mermaid-svg-SYDrjOyujcpdvuON .node rect,#mermaid-svg-SYDrjOyujcpdvuON .node circle,#mermaid-svg-SYDrjOyujcpdvuON .node ellipse,#mermaid-svg-SYDrjOyujcpdvuON .node polygon,#mermaid-svg-SYDrjOyujcpdvuON .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SYDrjOyujcpdvuON .rough-node .label text,#mermaid-svg-SYDrjOyujcpdvuON .node .label text,#mermaid-svg-SYDrjOyujcpdvuON .image-shape .label,#mermaid-svg-SYDrjOyujcpdvuON .icon-shape .label{text-anchor:middle;}#mermaid-svg-SYDrjOyujcpdvuON .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SYDrjOyujcpdvuON .rough-node .label,#mermaid-svg-SYDrjOyujcpdvuON .node .label,#mermaid-svg-SYDrjOyujcpdvuON .image-shape .label,#mermaid-svg-SYDrjOyujcpdvuON .icon-shape .label{text-align:center;}#mermaid-svg-SYDrjOyujcpdvuON .node.clickable{cursor:pointer;}#mermaid-svg-SYDrjOyujcpdvuON .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SYDrjOyujcpdvuON .arrowheadPath{fill:#333333;}#mermaid-svg-SYDrjOyujcpdvuON .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SYDrjOyujcpdvuON .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SYDrjOyujcpdvuON .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SYDrjOyujcpdvuON .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SYDrjOyujcpdvuON .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SYDrjOyujcpdvuON .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SYDrjOyujcpdvuON .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SYDrjOyujcpdvuON .cluster text{fill:#333;}#mermaid-svg-SYDrjOyujcpdvuON .cluster span{color:#333;}#mermaid-svg-SYDrjOyujcpdvuON div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SYDrjOyujcpdvuON .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SYDrjOyujcpdvuON rect.text{fill:none;stroke-width:0;}#mermaid-svg-SYDrjOyujcpdvuON .icon-shape,#mermaid-svg-SYDrjOyujcpdvuON .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SYDrjOyujcpdvuON .icon-shape p,#mermaid-svg-SYDrjOyujcpdvuON .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SYDrjOyujcpdvuON .icon-shape .label rect,#mermaid-svg-SYDrjOyujcpdvuON .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SYDrjOyujcpdvuON .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SYDrjOyujcpdvuON .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SYDrjOyujcpdvuON :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 纯函数状态转换
是
否
是
否
输入: usage.json
status == active

且 now - last_used

> stale_after_days?
返回 stale
status == stale

且 now - last_used

> archive_after_days?
返回 archived
保持当前状态

为什么用纯函数而非 LLM ?因为状态转换是一个确定性的决策------基于使用频率和时间,没有主观判断空间。使用 LLM 会引入不确定性和成本,而纯函数既快速又可预测。LLM 只在需要"理解"和"创造"的场景中使用(如合并整合),而非在机械的状态判断中。

6.4 archive 与 restore

#mermaid-svg-bFiWCxdgtDV8oZVv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bFiWCxdgtDV8oZVv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bFiWCxdgtDV8oZVv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bFiWCxdgtDV8oZVv .error-icon{fill:#552222;}#mermaid-svg-bFiWCxdgtDV8oZVv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bFiWCxdgtDV8oZVv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bFiWCxdgtDV8oZVv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bFiWCxdgtDV8oZVv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bFiWCxdgtDV8oZVv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bFiWCxdgtDV8oZVv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bFiWCxdgtDV8oZVv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bFiWCxdgtDV8oZVv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bFiWCxdgtDV8oZVv .marker.cross{stroke:#333333;}#mermaid-svg-bFiWCxdgtDV8oZVv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bFiWCxdgtDV8oZVv p{margin:0;}#mermaid-svg-bFiWCxdgtDV8oZVv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bFiWCxdgtDV8oZVv .cluster-label text{fill:#333;}#mermaid-svg-bFiWCxdgtDV8oZVv .cluster-label span{color:#333;}#mermaid-svg-bFiWCxdgtDV8oZVv .cluster-label span p{background-color:transparent;}#mermaid-svg-bFiWCxdgtDV8oZVv .label text,#mermaid-svg-bFiWCxdgtDV8oZVv span{fill:#333;color:#333;}#mermaid-svg-bFiWCxdgtDV8oZVv .node rect,#mermaid-svg-bFiWCxdgtDV8oZVv .node circle,#mermaid-svg-bFiWCxdgtDV8oZVv .node ellipse,#mermaid-svg-bFiWCxdgtDV8oZVv .node polygon,#mermaid-svg-bFiWCxdgtDV8oZVv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bFiWCxdgtDV8oZVv .rough-node .label text,#mermaid-svg-bFiWCxdgtDV8oZVv .node .label text,#mermaid-svg-bFiWCxdgtDV8oZVv .image-shape .label,#mermaid-svg-bFiWCxdgtDV8oZVv .icon-shape .label{text-anchor:middle;}#mermaid-svg-bFiWCxdgtDV8oZVv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-bFiWCxdgtDV8oZVv .rough-node .label,#mermaid-svg-bFiWCxdgtDV8oZVv .node .label,#mermaid-svg-bFiWCxdgtDV8oZVv .image-shape .label,#mermaid-svg-bFiWCxdgtDV8oZVv .icon-shape .label{text-align:center;}#mermaid-svg-bFiWCxdgtDV8oZVv .node.clickable{cursor:pointer;}#mermaid-svg-bFiWCxdgtDV8oZVv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-bFiWCxdgtDV8oZVv .arrowheadPath{fill:#333333;}#mermaid-svg-bFiWCxdgtDV8oZVv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bFiWCxdgtDV8oZVv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bFiWCxdgtDV8oZVv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bFiWCxdgtDV8oZVv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bFiWCxdgtDV8oZVv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bFiWCxdgtDV8oZVv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-bFiWCxdgtDV8oZVv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bFiWCxdgtDV8oZVv .cluster text{fill:#333;}#mermaid-svg-bFiWCxdgtDV8oZVv .cluster span{color:#333;}#mermaid-svg-bFiWCxdgtDV8oZVv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bFiWCxdgtDV8oZVv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bFiWCxdgtDV8oZVv rect.text{fill:none;stroke-width:0;}#mermaid-svg-bFiWCxdgtDV8oZVv .icon-shape,#mermaid-svg-bFiWCxdgtDV8oZVv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bFiWCxdgtDV8oZVv .icon-shape p,#mermaid-svg-bFiWCxdgtDV8oZVv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-bFiWCxdgtDV8oZVv .icon-shape .label rect,#mermaid-svg-bFiWCxdgtDV8oZVv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bFiWCxdgtDV8oZVv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-bFiWCxdgtDV8oZVv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-bFiWCxdgtDV8oZVv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 恢复流程
用户: restore_skill('xxx')
从 .archive/ 移回
重新加入 skill_search 索引
更新 usage.json:

status=active

last_used=now()
归档流程
技能超过 archive_after_days

未被使用
archive_skill()
移动到 .archive/ 目录
从 skill_search 索引移除
更新 usage.json:

status=archived

关键设计 :归档不删除 文件。技能被移动到 .archive/ 目录,文件完整保留。这是防御性设计------即使策展器错误地归档了一个有用技能,用户也可以随时恢复。删除是用户专属操作,系统永远不会自动删除技能。


七、Curator 编排器

Curator(策展器)是自我进化系统中的"图书管理员"------它不创造新知识,但负责维护知识库的整洁和一致性 。agent/curator.py 实现了一个定时运行的编排器,执行两类任务:自动状态转换 (纯函数,无 LLM)和 LLM 合并整合(将碎片化技能整合为类级指令)。

7.1 Curator 运行架构

#mermaid-svg-cmkm3EavGq5J41IR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cmkm3EavGq5J41IR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cmkm3EavGq5J41IR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cmkm3EavGq5J41IR .error-icon{fill:#552222;}#mermaid-svg-cmkm3EavGq5J41IR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cmkm3EavGq5J41IR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cmkm3EavGq5J41IR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cmkm3EavGq5J41IR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cmkm3EavGq5J41IR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cmkm3EavGq5J41IR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cmkm3EavGq5J41IR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cmkm3EavGq5J41IR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cmkm3EavGq5J41IR .marker.cross{stroke:#333333;}#mermaid-svg-cmkm3EavGq5J41IR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cmkm3EavGq5J41IR p{margin:0;}#mermaid-svg-cmkm3EavGq5J41IR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-cmkm3EavGq5J41IR .cluster-label text{fill:#333;}#mermaid-svg-cmkm3EavGq5J41IR .cluster-label span{color:#333;}#mermaid-svg-cmkm3EavGq5J41IR .cluster-label span p{background-color:transparent;}#mermaid-svg-cmkm3EavGq5J41IR .label text,#mermaid-svg-cmkm3EavGq5J41IR span{fill:#333;color:#333;}#mermaid-svg-cmkm3EavGq5J41IR .node rect,#mermaid-svg-cmkm3EavGq5J41IR .node circle,#mermaid-svg-cmkm3EavGq5J41IR .node ellipse,#mermaid-svg-cmkm3EavGq5J41IR .node polygon,#mermaid-svg-cmkm3EavGq5J41IR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cmkm3EavGq5J41IR .rough-node .label text,#mermaid-svg-cmkm3EavGq5J41IR .node .label text,#mermaid-svg-cmkm3EavGq5J41IR .image-shape .label,#mermaid-svg-cmkm3EavGq5J41IR .icon-shape .label{text-anchor:middle;}#mermaid-svg-cmkm3EavGq5J41IR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-cmkm3EavGq5J41IR .rough-node .label,#mermaid-svg-cmkm3EavGq5J41IR .node .label,#mermaid-svg-cmkm3EavGq5J41IR .image-shape .label,#mermaid-svg-cmkm3EavGq5J41IR .icon-shape .label{text-align:center;}#mermaid-svg-cmkm3EavGq5J41IR .node.clickable{cursor:pointer;}#mermaid-svg-cmkm3EavGq5J41IR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-cmkm3EavGq5J41IR .arrowheadPath{fill:#333333;}#mermaid-svg-cmkm3EavGq5J41IR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cmkm3EavGq5J41IR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cmkm3EavGq5J41IR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cmkm3EavGq5J41IR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-cmkm3EavGq5J41IR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cmkm3EavGq5J41IR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-cmkm3EavGq5J41IR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cmkm3EavGq5J41IR .cluster text{fill:#333;}#mermaid-svg-cmkm3EavGq5J41IR .cluster span{color:#333;}#mermaid-svg-cmkm3EavGq5J41IR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cmkm3EavGq5J41IR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-cmkm3EavGq5J41IR rect.text{fill:none;stroke-width:0;}#mermaid-svg-cmkm3EavGq5J41IR .icon-shape,#mermaid-svg-cmkm3EavGq5J41IR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cmkm3EavGq5J41IR .icon-shape p,#mermaid-svg-cmkm3EavGq5J41IR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-cmkm3EavGq5J41IR .icon-shape .label rect,#mermaid-svg-cmkm3EavGq5J41IR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cmkm3EavGq5J41IR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-cmkm3EavGq5J41IR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-cmkm3EavGq5J41IR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Phase 3: 报告
Phase 2: LLM 合并整合 (可选)
Phase 1: 自动状态转换 (无 LLM)
Curator 定时运行
active→stale
stale→archived
无需转换
是
否
定时器触发

interval_hours 间隔
curator.run()
预运行准备
创建快照

curator_backup/
打开审计账本

.curator_ledger.jsonl
扫描所有技能
对每个技能

运行纯函数状态判定
需要转换?
更新 usage.json
移动到 .archive/
跳过
写入账本
consolidate == true?
识别合并候选

同类技能簇
跳过合并
LLM 生成

umbrella skill
diff classify

分类变更
reconcile classification

校验分类
应用合并

归档被合并技能
cron 引用重写

_rewrite_cron_refs()
写入账本
生成 run.json

结构化运行记录
生成 REPORT.md

人类可读报告
关闭账本

7.2 预运行快照:安全网

在 curator 运行任何修改操作之前,它会先创建一个完整的技能库快照:
#mermaid-svg-1U9F5cdiJPdKeDSj{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1U9F5cdiJPdKeDSj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1U9F5cdiJPdKeDSj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1U9F5cdiJPdKeDSj .error-icon{fill:#552222;}#mermaid-svg-1U9F5cdiJPdKeDSj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1U9F5cdiJPdKeDSj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1U9F5cdiJPdKeDSj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1U9F5cdiJPdKeDSj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1U9F5cdiJPdKeDSj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1U9F5cdiJPdKeDSj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1U9F5cdiJPdKeDSj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1U9F5cdiJPdKeDSj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1U9F5cdiJPdKeDSj .marker.cross{stroke:#333333;}#mermaid-svg-1U9F5cdiJPdKeDSj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1U9F5cdiJPdKeDSj p{margin:0;}#mermaid-svg-1U9F5cdiJPdKeDSj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1U9F5cdiJPdKeDSj .cluster-label text{fill:#333;}#mermaid-svg-1U9F5cdiJPdKeDSj .cluster-label span{color:#333;}#mermaid-svg-1U9F5cdiJPdKeDSj .cluster-label span p{background-color:transparent;}#mermaid-svg-1U9F5cdiJPdKeDSj .label text,#mermaid-svg-1U9F5cdiJPdKeDSj span{fill:#333;color:#333;}#mermaid-svg-1U9F5cdiJPdKeDSj .node rect,#mermaid-svg-1U9F5cdiJPdKeDSj .node circle,#mermaid-svg-1U9F5cdiJPdKeDSj .node ellipse,#mermaid-svg-1U9F5cdiJPdKeDSj .node polygon,#mermaid-svg-1U9F5cdiJPdKeDSj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1U9F5cdiJPdKeDSj .rough-node .label text,#mermaid-svg-1U9F5cdiJPdKeDSj .node .label text,#mermaid-svg-1U9F5cdiJPdKeDSj .image-shape .label,#mermaid-svg-1U9F5cdiJPdKeDSj .icon-shape .label{text-anchor:middle;}#mermaid-svg-1U9F5cdiJPdKeDSj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1U9F5cdiJPdKeDSj .rough-node .label,#mermaid-svg-1U9F5cdiJPdKeDSj .node .label,#mermaid-svg-1U9F5cdiJPdKeDSj .image-shape .label,#mermaid-svg-1U9F5cdiJPdKeDSj .icon-shape .label{text-align:center;}#mermaid-svg-1U9F5cdiJPdKeDSj .node.clickable{cursor:pointer;}#mermaid-svg-1U9F5cdiJPdKeDSj .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1U9F5cdiJPdKeDSj .arrowheadPath{fill:#333333;}#mermaid-svg-1U9F5cdiJPdKeDSj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1U9F5cdiJPdKeDSj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1U9F5cdiJPdKeDSj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1U9F5cdiJPdKeDSj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1U9F5cdiJPdKeDSj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1U9F5cdiJPdKeDSj .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1U9F5cdiJPdKeDSj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1U9F5cdiJPdKeDSj .cluster text{fill:#333;}#mermaid-svg-1U9F5cdiJPdKeDSj .cluster span{color:#333;}#mermaid-svg-1U9F5cdiJPdKeDSj div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1U9F5cdiJPdKeDSj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1U9F5cdiJPdKeDSj rect.text{fill:none;stroke-width:0;}#mermaid-svg-1U9F5cdiJPdKeDSj .icon-shape,#mermaid-svg-1U9F5cdiJPdKeDSj .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1U9F5cdiJPdKeDSj .icon-shape p,#mermaid-svg-1U9F5cdiJPdKeDSj .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1U9F5cdiJPdKeDSj .icon-shape .label rect,#mermaid-svg-1U9F5cdiJPdKeDSj .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1U9F5cdiJPdKeDSj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1U9F5cdiJPdKeDSj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1U9F5cdiJPdKeDSj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 快照流程
是
否
curator.run() 开始
创建 curator_backup/

时间戳目录
复制全部技能文件

到快照目录
运行策展操作
运行成功?
保留快照

(用于回滚)
从快照恢复

回滚全部变更

这个快照是系统级回滚的安全网。如果 curator 在运行过程中崩溃或产生错误结果,可以从快照完全恢复到运行前的状态。这与技能账本的单编辑回滚不同------快照是整体回滚,账本是单操作回滚。

7.3 运行报告

每次 curator 运行都会生成两份报告:

报告文件 格式 受众 内容
run.json JSON 程序化 结构化运行记录:时间戳、操作列表、变更计数、错误
REPORT.md Markdown 人类 可读报告:本次运行摘要、归档了什么、合并了什么、警告

报告使得 curator 的每次运行都是可审计和可追溯 的。用户可以随时查看 REPORT.md 了解策展器做了什么,也可以通过 run.json 进行程序化分析。


八、LLM 合并整合深度解析

LLM 合并整合是 curator 中最复杂的功能------它将多个碎片化的同类技能整合为一个 umbrella skill(伞形技能),减少技能库的冗余并提升检索质量。这个过程涉及 LLM 理解、diff 分类、引用重写等多个步骤。

8.1 合并候选识别

#mermaid-svg-XuPxk0U7whWHPWTv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-XuPxk0U7whWHPWTv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XuPxk0U7whWHPWTv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XuPxk0U7whWHPWTv .error-icon{fill:#552222;}#mermaid-svg-XuPxk0U7whWHPWTv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XuPxk0U7whWHPWTv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XuPxk0U7whWHPWTv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XuPxk0U7whWHPWTv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XuPxk0U7whWHPWTv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XuPxk0U7whWHPWTv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XuPxk0U7whWHPWTv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XuPxk0U7whWHPWTv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XuPxk0U7whWHPWTv .marker.cross{stroke:#333333;}#mermaid-svg-XuPxk0U7whWHPWTv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XuPxk0U7whWHPWTv p{margin:0;}#mermaid-svg-XuPxk0U7whWHPWTv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-XuPxk0U7whWHPWTv .cluster-label text{fill:#333;}#mermaid-svg-XuPxk0U7whWHPWTv .cluster-label span{color:#333;}#mermaid-svg-XuPxk0U7whWHPWTv .cluster-label span p{background-color:transparent;}#mermaid-svg-XuPxk0U7whWHPWTv .label text,#mermaid-svg-XuPxk0U7whWHPWTv span{fill:#333;color:#333;}#mermaid-svg-XuPxk0U7whWHPWTv .node rect,#mermaid-svg-XuPxk0U7whWHPWTv .node circle,#mermaid-svg-XuPxk0U7whWHPWTv .node ellipse,#mermaid-svg-XuPxk0U7whWHPWTv .node polygon,#mermaid-svg-XuPxk0U7whWHPWTv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XuPxk0U7whWHPWTv .rough-node .label text,#mermaid-svg-XuPxk0U7whWHPWTv .node .label text,#mermaid-svg-XuPxk0U7whWHPWTv .image-shape .label,#mermaid-svg-XuPxk0U7whWHPWTv .icon-shape .label{text-anchor:middle;}#mermaid-svg-XuPxk0U7whWHPWTv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-XuPxk0U7whWHPWTv .rough-node .label,#mermaid-svg-XuPxk0U7whWHPWTv .node .label,#mermaid-svg-XuPxk0U7whWHPWTv .image-shape .label,#mermaid-svg-XuPxk0U7whWHPWTv .icon-shape .label{text-align:center;}#mermaid-svg-XuPxk0U7whWHPWTv .node.clickable{cursor:pointer;}#mermaid-svg-XuPxk0U7whWHPWTv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-XuPxk0U7whWHPWTv .arrowheadPath{fill:#333333;}#mermaid-svg-XuPxk0U7whWHPWTv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XuPxk0U7whWHPWTv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XuPxk0U7whWHPWTv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XuPxk0U7whWHPWTv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-XuPxk0U7whWHPWTv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XuPxk0U7whWHPWTv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-XuPxk0U7whWHPWTv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XuPxk0U7whWHPWTv .cluster text{fill:#333;}#mermaid-svg-XuPxk0U7whWHPWTv .cluster span{color:#333;}#mermaid-svg-XuPxk0U7whWHPWTv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-XuPxk0U7whWHPWTv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-XuPxk0U7whWHPWTv rect.text{fill:none;stroke-width:0;}#mermaid-svg-XuPxk0U7whWHPWTv .icon-shape,#mermaid-svg-XuPxk0U7whWHPWTv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XuPxk0U7whWHPWTv .icon-shape p,#mermaid-svg-XuPxk0U7whWHPWTv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-XuPxk0U7whWHPWTv .icon-shape .label rect,#mermaid-svg-XuPxk0U7whWHPWTv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XuPxk0U7whWHPWTv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-XuPxk0U7whWHPWTv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-XuPxk0U7whWHPWTv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 候选识别
是
否
扫描所有 active 技能
按主题/关键词聚类
存在同类簇?

(≥2 个技能

描述相似)
标记为合并候选
跳过
传递给 LLM

进行合并

8.2 LLM 合并过程

Ledger Skill Store LLM Provider Curator Ledger Skill Store LLM Provider Curator #mermaid-svg-JHH1lmKESUwNFjp7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JHH1lmKESUwNFjp7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JHH1lmKESUwNFjp7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JHH1lmKESUwNFjp7 .error-icon{fill:#552222;}#mermaid-svg-JHH1lmKESUwNFjp7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JHH1lmKESUwNFjp7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JHH1lmKESUwNFjp7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JHH1lmKESUwNFjp7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JHH1lmKESUwNFjp7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JHH1lmKESUwNFjp7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JHH1lmKESUwNFjp7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JHH1lmKESUwNFjp7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JHH1lmKESUwNFjp7 .marker.cross{stroke:#333333;}#mermaid-svg-JHH1lmKESUwNFjp7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JHH1lmKESUwNFjp7 p{margin:0;}#mermaid-svg-JHH1lmKESUwNFjp7 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-JHH1lmKESUwNFjp7 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-JHH1lmKESUwNFjp7 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-JHH1lmKESUwNFjp7 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-JHH1lmKESUwNFjp7 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-JHH1lmKESUwNFjp7 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-JHH1lmKESUwNFjp7 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-JHH1lmKESUwNFjp7 .sequenceNumber{fill:white;}#mermaid-svg-JHH1lmKESUwNFjp7 #sequencenumber{fill:#333;}#mermaid-svg-JHH1lmKESUwNFjp7 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-JHH1lmKESUwNFjp7 .messageText{fill:#333;stroke:none;}#mermaid-svg-JHH1lmKESUwNFjp7 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-JHH1lmKESUwNFjp7 .labelText,#mermaid-svg-JHH1lmKESUwNFjp7 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-JHH1lmKESUwNFjp7 .loopText,#mermaid-svg-JHH1lmKESUwNFjp7 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-JHH1lmKESUwNFjp7 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-JHH1lmKESUwNFjp7 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-JHH1lmKESUwNFjp7 .noteText,#mermaid-svg-JHH1lmKESUwNFjp7 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-JHH1lmKESUwNFjp7 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-JHH1lmKESUwNFjp7 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-JHH1lmKESUwNFjp7 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-JHH1lmKESUwNFjp7 .actorPopupMenu{position:absolute;}#mermaid-svg-JHH1lmKESUwNFjp7 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-JHH1lmKESUwNFjp7 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-JHH1lmKESUwNFjp7 .actor-man circle,#mermaid-svg-JHH1lmKESUwNFjp7 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-JHH1lmKESUwNFjp7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 分类类型:• added: 新增内容• modified: 修改内容• removed: 删除内容• moved: 移动内容 识别合并候选簇准备合并提示词(含全部候选技能内容)请求生成 umbrella skill返回合并后的 SKILL.mddiff classify分类变更类型reconcile classification校验分类合理性创建 umbrella skill归档被合并的技能(移动到 .archive/)_rewrite_cron_refs()重写 cron 引用写入审计账本(含合并详情)

8.3 diff classify:变更分类

合并后的 umbrella skill 与原始技能之间的差异需要被分类,以便审计和理解 LLM 的合并行为:

分类 含义 审计意义
added umbrella 中新增的内容 LLM 认为缺失的知识
modified 被修改的内容 LLM 优化了表述或更新了信息
removed 被删除的内容 LLM 认为冗余或过时的内容
moved 被移动的内容 LLM 重新组织了结构

8.4 reconcile classification:分类校验

reconcile classification 是对 diff classify 结果的二次校验------它检查分类是否合理,例如:

  • removed 分类是否删除了重要内容?(如果是,标记为需要人工审查)
  • added 分类是否引入了与原始技能无关的内容?(如果是,可能是 LLM 幻觉)
  • modified 分类是否改变了技能的核心语义?(如果是,需要谨慎)

这个校验步骤是防御性设计的体现------LLM 合并可能产生错误,reconcile 是最后一道检查。

8.5 _rewrite_cron_refs:Cron 引用重写

当技能被合并后,原来引用被合并技能的 cron 任务需要被重写为引用新的 umbrella skill:
#mermaid-svg-sMGv7q8N9ZPEXaAH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sMGv7q8N9ZPEXaAH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sMGv7q8N9ZPEXaAH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sMGv7q8N9ZPEXaAH .error-icon{fill:#552222;}#mermaid-svg-sMGv7q8N9ZPEXaAH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sMGv7q8N9ZPEXaAH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sMGv7q8N9ZPEXaAH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sMGv7q8N9ZPEXaAH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sMGv7q8N9ZPEXaAH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sMGv7q8N9ZPEXaAH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sMGv7q8N9ZPEXaAH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sMGv7q8N9ZPEXaAH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sMGv7q8N9ZPEXaAH .marker.cross{stroke:#333333;}#mermaid-svg-sMGv7q8N9ZPEXaAH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sMGv7q8N9ZPEXaAH p{margin:0;}#mermaid-svg-sMGv7q8N9ZPEXaAH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sMGv7q8N9ZPEXaAH .cluster-label text{fill:#333;}#mermaid-svg-sMGv7q8N9ZPEXaAH .cluster-label span{color:#333;}#mermaid-svg-sMGv7q8N9ZPEXaAH .cluster-label span p{background-color:transparent;}#mermaid-svg-sMGv7q8N9ZPEXaAH .label text,#mermaid-svg-sMGv7q8N9ZPEXaAH span{fill:#333;color:#333;}#mermaid-svg-sMGv7q8N9ZPEXaAH .node rect,#mermaid-svg-sMGv7q8N9ZPEXaAH .node circle,#mermaid-svg-sMGv7q8N9ZPEXaAH .node ellipse,#mermaid-svg-sMGv7q8N9ZPEXaAH .node polygon,#mermaid-svg-sMGv7q8N9ZPEXaAH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sMGv7q8N9ZPEXaAH .rough-node .label text,#mermaid-svg-sMGv7q8N9ZPEXaAH .node .label text,#mermaid-svg-sMGv7q8N9ZPEXaAH .image-shape .label,#mermaid-svg-sMGv7q8N9ZPEXaAH .icon-shape .label{text-anchor:middle;}#mermaid-svg-sMGv7q8N9ZPEXaAH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sMGv7q8N9ZPEXaAH .rough-node .label,#mermaid-svg-sMGv7q8N9ZPEXaAH .node .label,#mermaid-svg-sMGv7q8N9ZPEXaAH .image-shape .label,#mermaid-svg-sMGv7q8N9ZPEXaAH .icon-shape .label{text-align:center;}#mermaid-svg-sMGv7q8N9ZPEXaAH .node.clickable{cursor:pointer;}#mermaid-svg-sMGv7q8N9ZPEXaAH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sMGv7q8N9ZPEXaAH .arrowheadPath{fill:#333333;}#mermaid-svg-sMGv7q8N9ZPEXaAH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sMGv7q8N9ZPEXaAH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sMGv7q8N9ZPEXaAH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sMGv7q8N9ZPEXaAH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sMGv7q8N9ZPEXaAH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sMGv7q8N9ZPEXaAH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sMGv7q8N9ZPEXaAH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sMGv7q8N9ZPEXaAH .cluster text{fill:#333;}#mermaid-svg-sMGv7q8N9ZPEXaAH .cluster span{color:#333;}#mermaid-svg-sMGv7q8N9ZPEXaAH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sMGv7q8N9ZPEXaAH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sMGv7q8N9ZPEXaAH rect.text{fill:none;stroke-width:0;}#mermaid-svg-sMGv7q8N9ZPEXaAH .icon-shape,#mermaid-svg-sMGv7q8N9ZPEXaAH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sMGv7q8N9ZPEXaAH .icon-shape p,#mermaid-svg-sMGv7q8N9ZPEXaAH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sMGv7q8N9ZPEXaAH .icon-shape .label rect,#mermaid-svg-sMGv7q8N9ZPEXaAH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sMGv7q8N9ZPEXaAH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sMGv7q8N9ZPEXaAH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sMGv7q8N9ZPEXaAH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Cron 引用重写
合并前:

cron 任务 A → skill_x
skill_x 被合并到

umbrella_skill
_rewrite_cron_refs()
重写 cron 任务 A

→ umbrella_skill
确保 cron 任务

不会引用归档技能

如果不重写 cron 引用,cron 任务会尝试引用已归档的技能,导致执行失败。这个重写步骤确保合并操作不会破坏 cron 任务的正常运行。


九、/learn 主动学习

除了自动审查和定时策展外,用户还可以通过 /learn 命令主动将外部知识蒸馏为技能。这是自我进化系统中唯一由用户完全控制的学习路径------用户决定学什么、从哪里学、学到什么程度。

9.1 /learn 命令流程

skill_manage learn_prompt AIAgent 用户 skill_manage learn_prompt AIAgent 用户 #mermaid-svg-uu5AQc997Ah5GrE7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uu5AQc997Ah5GrE7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uu5AQc997Ah5GrE7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uu5AQc997Ah5GrE7 .error-icon{fill:#552222;}#mermaid-svg-uu5AQc997Ah5GrE7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uu5AQc997Ah5GrE7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uu5AQc997Ah5GrE7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uu5AQc997Ah5GrE7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uu5AQc997Ah5GrE7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uu5AQc997Ah5GrE7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uu5AQc997Ah5GrE7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uu5AQc997Ah5GrE7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uu5AQc997Ah5GrE7 .marker.cross{stroke:#333333;}#mermaid-svg-uu5AQc997Ah5GrE7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uu5AQc997Ah5GrE7 p{margin:0;}#mermaid-svg-uu5AQc997Ah5GrE7 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-uu5AQc997Ah5GrE7 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-uu5AQc997Ah5GrE7 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-uu5AQc997Ah5GrE7 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-uu5AQc997Ah5GrE7 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-uu5AQc997Ah5GrE7 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-uu5AQc997Ah5GrE7 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-uu5AQc997Ah5GrE7 .sequenceNumber{fill:white;}#mermaid-svg-uu5AQc997Ah5GrE7 #sequencenumber{fill:#333;}#mermaid-svg-uu5AQc997Ah5GrE7 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-uu5AQc997Ah5GrE7 .messageText{fill:#333;stroke:none;}#mermaid-svg-uu5AQc997Ah5GrE7 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-uu5AQc997Ah5GrE7 .labelText,#mermaid-svg-uu5AQc997Ah5GrE7 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-uu5AQc997Ah5GrE7 .loopText,#mermaid-svg-uu5AQc997Ah5GrE7 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-uu5AQc997Ah5GrE7 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-uu5AQc997Ah5GrE7 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-uu5AQc997Ah5GrE7 .noteText,#mermaid-svg-uu5AQc997Ah5GrE7 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-uu5AQc997Ah5GrE7 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uu5AQc997Ah5GrE7 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uu5AQc997Ah5GrE7 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uu5AQc997Ah5GrE7 .actorPopupMenu{position:absolute;}#mermaid-svg-uu5AQc997Ah5GrE7 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-uu5AQc997Ah5GrE7 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-uu5AQc997Ah5GrE7 .actor-man circle,#mermaid-svg-uu5AQc997Ah5GrE7 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-uu5AQc997Ah5GrE7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} /learn 源材料描述构建 /learn 提示词注入 _AUTHORING_STANDARDS(技能创作标准)注入 _KNOWLEDGE_SKILL_STANDARDS(知识库布局标准)返回完整提示词run_conversation(learn_prompt)分析源材料提炼可复用知识skill_manage(create)创建新技能技能创建成功"✅ 已学习: 技能名"

9.2 _AUTHORING_STANDARDS:技能创作标准

/learn 提示词中注入了严格的技能创作标准,确保用户创建的技能符合系统规范:

标准项 要求 原因
description 长度 ≤ 60 字符 技能描述需要简洁,用于 skill_search 的匹配
文件命名 SKILL.md 为主文件 统一命名便于检索
目录结构 每个技能一个目录 隔离不同技能的文件
支持文件 可包含 LESSONS.md 等 存储课程和辅助知识
元数据 必须包含 provenance 可审计性

9.3 _KNOWLEDGE_SKILL_STANDARDS:知识库布局

知识库布局标准定义了技能在文件系统中的组织方式:
#mermaid-svg-RKmr2ZXWK3II2XW5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-RKmr2ZXWK3II2XW5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-RKmr2ZXWK3II2XW5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-RKmr2ZXWK3II2XW5 .error-icon{fill:#552222;}#mermaid-svg-RKmr2ZXWK3II2XW5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RKmr2ZXWK3II2XW5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-RKmr2ZXWK3II2XW5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RKmr2ZXWK3II2XW5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RKmr2ZXWK3II2XW5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-RKmr2ZXWK3II2XW5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RKmr2ZXWK3II2XW5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RKmr2ZXWK3II2XW5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RKmr2ZXWK3II2XW5 .marker.cross{stroke:#333333;}#mermaid-svg-RKmr2ZXWK3II2XW5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RKmr2ZXWK3II2XW5 p{margin:0;}#mermaid-svg-RKmr2ZXWK3II2XW5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-RKmr2ZXWK3II2XW5 .cluster-label text{fill:#333;}#mermaid-svg-RKmr2ZXWK3II2XW5 .cluster-label span{color:#333;}#mermaid-svg-RKmr2ZXWK3II2XW5 .cluster-label span p{background-color:transparent;}#mermaid-svg-RKmr2ZXWK3II2XW5 .label text,#mermaid-svg-RKmr2ZXWK3II2XW5 span{fill:#333;color:#333;}#mermaid-svg-RKmr2ZXWK3II2XW5 .node rect,#mermaid-svg-RKmr2ZXWK3II2XW5 .node circle,#mermaid-svg-RKmr2ZXWK3II2XW5 .node ellipse,#mermaid-svg-RKmr2ZXWK3II2XW5 .node polygon,#mermaid-svg-RKmr2ZXWK3II2XW5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RKmr2ZXWK3II2XW5 .rough-node .label text,#mermaid-svg-RKmr2ZXWK3II2XW5 .node .label text,#mermaid-svg-RKmr2ZXWK3II2XW5 .image-shape .label,#mermaid-svg-RKmr2ZXWK3II2XW5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-RKmr2ZXWK3II2XW5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-RKmr2ZXWK3II2XW5 .rough-node .label,#mermaid-svg-RKmr2ZXWK3II2XW5 .node .label,#mermaid-svg-RKmr2ZXWK3II2XW5 .image-shape .label,#mermaid-svg-RKmr2ZXWK3II2XW5 .icon-shape .label{text-align:center;}#mermaid-svg-RKmr2ZXWK3II2XW5 .node.clickable{cursor:pointer;}#mermaid-svg-RKmr2ZXWK3II2XW5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-RKmr2ZXWK3II2XW5 .arrowheadPath{fill:#333333;}#mermaid-svg-RKmr2ZXWK3II2XW5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RKmr2ZXWK3II2XW5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RKmr2ZXWK3II2XW5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RKmr2ZXWK3II2XW5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-RKmr2ZXWK3II2XW5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RKmr2ZXWK3II2XW5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-RKmr2ZXWK3II2XW5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RKmr2ZXWK3II2XW5 .cluster text{fill:#333;}#mermaid-svg-RKmr2ZXWK3II2XW5 .cluster span{color:#333;}#mermaid-svg-RKmr2ZXWK3II2XW5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RKmr2ZXWK3II2XW5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-RKmr2ZXWK3II2XW5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-RKmr2ZXWK3II2XW5 .icon-shape,#mermaid-svg-RKmr2ZXWK3II2XW5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RKmr2ZXWK3II2XW5 .icon-shape p,#mermaid-svg-RKmr2ZXWK3II2XW5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-RKmr2ZXWK3II2XW5 .icon-shape .label rect,#mermaid-svg-RKmr2ZXWK3II2XW5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RKmr2ZXWK3II2XW5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-RKmr2ZXWK3II2XW5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-RKmr2ZXWK3II2XW5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ~/.hermes/skills/ 知识库布局
单个技能目录结构
skill-name/
skills/
active 技能目录

(直接子目录)
.archive/

归档技能
SKILL.md

(主技能文件)
LESSONS.md

(课程, 可选)
supporting files

(可选)
usage.json

(遥测数据)

9.4 源文本卫生

/learn 的源材料可能来自多种渠道(会话历史、URL、文件),系统会对源文本进行卫生处理,确保不引入安全问题:

  • 凭证过滤:扫描并移除源文本中的 API keys、密码、token
  • 格式清理:移除不必要的空白、控制字符
  • 长度限制:过长的源文本会被截断,防止 LLM 上下文溢出
  • 编码规范化:确保文本使用 UTF-8 编码

相关推荐
Ai-_Man1 小时前
您您这可以把Grok的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。AI导出鸭
javascript·人工智能·ai·小程序·电脑
Harzerr1 小时前
AI行业日报|2026-10-04:5个热点事件
ai·行业动态·技术趋势
Bug收容所1 小时前
学习LangChain day1
学习·langchain·llm·agent
汤姆yu2 小时前
Gemini 4 Argon模型综述:技术、能力与实际使用指南
网络·安全·web安全·ai·大模型
搭贝2 小时前
上厕所的时间搭好一套系统:AI自动生成实测
开发语言·人工智能·低代码·ai·php·搭贝
老A的AI实验室2 小时前
Cyber Weekly #84
人工智能·ai·llm·agi·genai
lie..2 小时前
30天从零开始学AI应用开发(Day 18):文档切分与检索优化:RAG 效果好坏的分水岭
人工智能·ai·大模型
流浪0012 小时前
大模型技术全景(十一):智能体通信协议 MCP、A2A 与 ANP
llm·agent·通信协议·mcp·a2a·anp
小此方2 小时前
LangChain/LangGraph(二)大模型接入篇一:API接入,从API Key到API请求报文,使用Apifox完成大模型接口调用
ai·langchain