十、技能创作标准
技能创作标准是 skills/AGENTS.md 中定义的一组规范,指导代理和用户如何创建高质量的技能。这些标准不是建议------它们是强制要求 ,由 skill_manage 工具在写入时校验。
10.1 技能描述的 60 字符限制
技能的 description 字段被限制在 60 字符以内。这不是随意的限制------它直接影响 skill_search 的匹配质量:
#mermaid-svg-jjpfL1VuTGiS4Box{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-jjpfL1VuTGiS4Box .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jjpfL1VuTGiS4Box .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jjpfL1VuTGiS4Box .error-icon{fill:#552222;}#mermaid-svg-jjpfL1VuTGiS4Box .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jjpfL1VuTGiS4Box .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jjpfL1VuTGiS4Box .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jjpfL1VuTGiS4Box .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jjpfL1VuTGiS4Box .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jjpfL1VuTGiS4Box .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jjpfL1VuTGiS4Box .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jjpfL1VuTGiS4Box .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jjpfL1VuTGiS4Box .marker.cross{stroke:#333333;}#mermaid-svg-jjpfL1VuTGiS4Box svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jjpfL1VuTGiS4Box p{margin:0;}#mermaid-svg-jjpfL1VuTGiS4Box .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-jjpfL1VuTGiS4Box .cluster-label text{fill:#333;}#mermaid-svg-jjpfL1VuTGiS4Box .cluster-label span{color:#333;}#mermaid-svg-jjpfL1VuTGiS4Box .cluster-label span p{background-color:transparent;}#mermaid-svg-jjpfL1VuTGiS4Box .label text,#mermaid-svg-jjpfL1VuTGiS4Box span{fill:#333;color:#333;}#mermaid-svg-jjpfL1VuTGiS4Box .node rect,#mermaid-svg-jjpfL1VuTGiS4Box .node circle,#mermaid-svg-jjpfL1VuTGiS4Box .node ellipse,#mermaid-svg-jjpfL1VuTGiS4Box .node polygon,#mermaid-svg-jjpfL1VuTGiS4Box .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jjpfL1VuTGiS4Box .rough-node .label text,#mermaid-svg-jjpfL1VuTGiS4Box .node .label text,#mermaid-svg-jjpfL1VuTGiS4Box .image-shape .label,#mermaid-svg-jjpfL1VuTGiS4Box .icon-shape .label{text-anchor:middle;}#mermaid-svg-jjpfL1VuTGiS4Box .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jjpfL1VuTGiS4Box .rough-node .label,#mermaid-svg-jjpfL1VuTGiS4Box .node .label,#mermaid-svg-jjpfL1VuTGiS4Box .image-shape .label,#mermaid-svg-jjpfL1VuTGiS4Box .icon-shape .label{text-align:center;}#mermaid-svg-jjpfL1VuTGiS4Box .node.clickable{cursor:pointer;}#mermaid-svg-jjpfL1VuTGiS4Box .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jjpfL1VuTGiS4Box .arrowheadPath{fill:#333333;}#mermaid-svg-jjpfL1VuTGiS4Box .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jjpfL1VuTGiS4Box .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jjpfL1VuTGiS4Box .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jjpfL1VuTGiS4Box .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jjpfL1VuTGiS4Box .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jjpfL1VuTGiS4Box .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jjpfL1VuTGiS4Box .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jjpfL1VuTGiS4Box .cluster text{fill:#333;}#mermaid-svg-jjpfL1VuTGiS4Box .cluster span{color:#333;}#mermaid-svg-jjpfL1VuTGiS4Box 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-jjpfL1VuTGiS4Box .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jjpfL1VuTGiS4Box rect.text{fill:none;stroke-width:0;}#mermaid-svg-jjpfL1VuTGiS4Box .icon-shape,#mermaid-svg-jjpfL1VuTGiS4Box .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jjpfL1VuTGiS4Box .icon-shape p,#mermaid-svg-jjpfL1VuTGiS4Box .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jjpfL1VuTGiS4Box .icon-shape .label rect,#mermaid-svg-jjpfL1VuTGiS4Box .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jjpfL1VuTGiS4Box .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jjpfL1VuTGiS4Box .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jjpfL1VuTGiS4Box :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 为什么限制 60 字符
description 用于
skill_search 匹配
过长的描述
会降低匹配精度
过长的描述
会污染系统提示词
60 字符迫使
作者提炼核心语义
精炼的描述
→ 高质量匹配
10.2 技能内容结构
一个高质量的技能应该包含以下结构:
#mermaid-svg-BhGMSYTFM2HZ0VHY{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-BhGMSYTFM2HZ0VHY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BhGMSYTFM2HZ0VHY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BhGMSYTFM2HZ0VHY .error-icon{fill:#552222;}#mermaid-svg-BhGMSYTFM2HZ0VHY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BhGMSYTFM2HZ0VHY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BhGMSYTFM2HZ0VHY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BhGMSYTFM2HZ0VHY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BhGMSYTFM2HZ0VHY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BhGMSYTFM2HZ0VHY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BhGMSYTFM2HZ0VHY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BhGMSYTFM2HZ0VHY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BhGMSYTFM2HZ0VHY .marker.cross{stroke:#333333;}#mermaid-svg-BhGMSYTFM2HZ0VHY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BhGMSYTFM2HZ0VHY p{margin:0;}#mermaid-svg-BhGMSYTFM2HZ0VHY .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-BhGMSYTFM2HZ0VHY .cluster-label text{fill:#333;}#mermaid-svg-BhGMSYTFM2HZ0VHY .cluster-label span{color:#333;}#mermaid-svg-BhGMSYTFM2HZ0VHY .cluster-label span p{background-color:transparent;}#mermaid-svg-BhGMSYTFM2HZ0VHY .label text,#mermaid-svg-BhGMSYTFM2HZ0VHY span{fill:#333;color:#333;}#mermaid-svg-BhGMSYTFM2HZ0VHY .node rect,#mermaid-svg-BhGMSYTFM2HZ0VHY .node circle,#mermaid-svg-BhGMSYTFM2HZ0VHY .node ellipse,#mermaid-svg-BhGMSYTFM2HZ0VHY .node polygon,#mermaid-svg-BhGMSYTFM2HZ0VHY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BhGMSYTFM2HZ0VHY .rough-node .label text,#mermaid-svg-BhGMSYTFM2HZ0VHY .node .label text,#mermaid-svg-BhGMSYTFM2HZ0VHY .image-shape .label,#mermaid-svg-BhGMSYTFM2HZ0VHY .icon-shape .label{text-anchor:middle;}#mermaid-svg-BhGMSYTFM2HZ0VHY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BhGMSYTFM2HZ0VHY .rough-node .label,#mermaid-svg-BhGMSYTFM2HZ0VHY .node .label,#mermaid-svg-BhGMSYTFM2HZ0VHY .image-shape .label,#mermaid-svg-BhGMSYTFM2HZ0VHY .icon-shape .label{text-align:center;}#mermaid-svg-BhGMSYTFM2HZ0VHY .node.clickable{cursor:pointer;}#mermaid-svg-BhGMSYTFM2HZ0VHY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BhGMSYTFM2HZ0VHY .arrowheadPath{fill:#333333;}#mermaid-svg-BhGMSYTFM2HZ0VHY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BhGMSYTFM2HZ0VHY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BhGMSYTFM2HZ0VHY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BhGMSYTFM2HZ0VHY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BhGMSYTFM2HZ0VHY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BhGMSYTFM2HZ0VHY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BhGMSYTFM2HZ0VHY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BhGMSYTFM2HZ0VHY .cluster text{fill:#333;}#mermaid-svg-BhGMSYTFM2HZ0VHY .cluster span{color:#333;}#mermaid-svg-BhGMSYTFM2HZ0VHY 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-BhGMSYTFM2HZ0VHY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BhGMSYTFM2HZ0VHY rect.text{fill:none;stroke-width:0;}#mermaid-svg-BhGMSYTFM2HZ0VHY .icon-shape,#mermaid-svg-BhGMSYTFM2HZ0VHY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BhGMSYTFM2HZ0VHY .icon-shape p,#mermaid-svg-BhGMSYTFM2HZ0VHY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BhGMSYTFM2HZ0VHY .icon-shape .label rect,#mermaid-svg-BhGMSYTFM2HZ0VHY .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BhGMSYTFM2HZ0VHY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BhGMSYTFM2HZ0VHY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BhGMSYTFM2HZ0VHY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SKILL.md 推荐结构
name: skill-name
description: ≤60 字符描述
目的
这个技能解决什么问题
何时使用
触发条件
步骤
-
...
-
...
-
...
工具
使用的工具和命令
常见陷阱
耗时坑和避免方法
用户偏好
用户对结果的偏好
10.3 技能命名规范
| 命名规则 | 示例 | 原因 |
|---|---|---|
| 使用 kebab-case | python-testing |
文件系统友好 |
| 包含领域前缀 | react-component-creation |
便于聚类 |
| 避免动词开头 | 不用 test-python |
名词短语更稳定 |
| 长度适中 | ≤ 30 字符 | 可读性 |
10.4 支持文件规范
技能可以包含支持文件,但需要遵循规范:
LESSONS.md:存储从实践中学习的课程,不是步骤而是经验- 支持文件应该被
SKILL.md引用,而非独立存在 - 支持文件不应包含敏感信息
- 支持文件的大小应该合理(单文件 < 10KB)
十一、学习图谱构建
学习图谱是自我进化系统的可视化层------它将技能和记忆之间的关系建模为一张图,帮助用户和代理理解知识库的结构。agent/learning_graph.py 实现了图谱的构建和查询。
11.1 图谱节点与边
#mermaid-svg-pSTSy6KT0D414yyH{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-pSTSy6KT0D414yyH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pSTSy6KT0D414yyH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pSTSy6KT0D414yyH .error-icon{fill:#552222;}#mermaid-svg-pSTSy6KT0D414yyH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pSTSy6KT0D414yyH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pSTSy6KT0D414yyH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pSTSy6KT0D414yyH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pSTSy6KT0D414yyH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pSTSy6KT0D414yyH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pSTSy6KT0D414yyH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pSTSy6KT0D414yyH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pSTSy6KT0D414yyH .marker.cross{stroke:#333333;}#mermaid-svg-pSTSy6KT0D414yyH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pSTSy6KT0D414yyH p{margin:0;}#mermaid-svg-pSTSy6KT0D414yyH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pSTSy6KT0D414yyH .cluster-label text{fill:#333;}#mermaid-svg-pSTSy6KT0D414yyH .cluster-label span{color:#333;}#mermaid-svg-pSTSy6KT0D414yyH .cluster-label span p{background-color:transparent;}#mermaid-svg-pSTSy6KT0D414yyH .label text,#mermaid-svg-pSTSy6KT0D414yyH span{fill:#333;color:#333;}#mermaid-svg-pSTSy6KT0D414yyH .node rect,#mermaid-svg-pSTSy6KT0D414yyH .node circle,#mermaid-svg-pSTSy6KT0D414yyH .node ellipse,#mermaid-svg-pSTSy6KT0D414yyH .node polygon,#mermaid-svg-pSTSy6KT0D414yyH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pSTSy6KT0D414yyH .rough-node .label text,#mermaid-svg-pSTSy6KT0D414yyH .node .label text,#mermaid-svg-pSTSy6KT0D414yyH .image-shape .label,#mermaid-svg-pSTSy6KT0D414yyH .icon-shape .label{text-anchor:middle;}#mermaid-svg-pSTSy6KT0D414yyH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pSTSy6KT0D414yyH .rough-node .label,#mermaid-svg-pSTSy6KT0D414yyH .node .label,#mermaid-svg-pSTSy6KT0D414yyH .image-shape .label,#mermaid-svg-pSTSy6KT0D414yyH .icon-shape .label{text-align:center;}#mermaid-svg-pSTSy6KT0D414yyH .node.clickable{cursor:pointer;}#mermaid-svg-pSTSy6KT0D414yyH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pSTSy6KT0D414yyH .arrowheadPath{fill:#333333;}#mermaid-svg-pSTSy6KT0D414yyH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pSTSy6KT0D414yyH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pSTSy6KT0D414yyH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pSTSy6KT0D414yyH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pSTSy6KT0D414yyH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pSTSy6KT0D414yyH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pSTSy6KT0D414yyH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pSTSy6KT0D414yyH .cluster text{fill:#333;}#mermaid-svg-pSTSy6KT0D414yyH .cluster span{color:#333;}#mermaid-svg-pSTSy6KT0D414yyH 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-pSTSy6KT0D414yyH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pSTSy6KT0D414yyH rect.text{fill:none;stroke-width:0;}#mermaid-svg-pSTSy6KT0D414yyH .icon-shape,#mermaid-svg-pSTSy6KT0D414yyH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pSTSy6KT0D414yyH .icon-shape p,#mermaid-svg-pSTSy6KT0D414yyH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pSTSy6KT0D414yyH .icon-shape .label rect,#mermaid-svg-pSTSy6KT0D414yyH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pSTSy6KT0D414yyH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pSTSy6KT0D414yyH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pSTSy6KT0D414yyH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 学习图谱结构
边类型
节点类型
SkillNode
(技能节点)
MemoryNode
(记忆节点)
related_skills 边
(技能间显式关联)
词汇重叠边
(技能间隐式关联)
memory-skill 边
(记忆与技能关联)
技能 A
python-testing
技能 B
pytest-fixtures
技能 C
python-logging
记忆 X
用户偏好 Python
11.2 SkillNode 结构
每个技能在图谱中表示为一个 SkillNode,包含以下字段:
| 字段 | 类型 | 说明 |
|---|---|---|
name |
str | 技能名称 |
description |
str | 技能描述 |
status |
str | active/stale/archived |
used_count |
int | 使用次数 |
last_used |
str | 最后使用时间 |
related_skills |
liststr | 显式关联的技能名 |
tags |
liststr | 从描述提取的标签 |
density |
float | 关联密度(边数/节点数) |
11.3 边的构建逻辑
#mermaid-svg-nJ50NKd9iVTMsMja{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-nJ50NKd9iVTMsMja .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nJ50NKd9iVTMsMja .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nJ50NKd9iVTMsMja .error-icon{fill:#552222;}#mermaid-svg-nJ50NKd9iVTMsMja .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nJ50NKd9iVTMsMja .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nJ50NKd9iVTMsMja .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nJ50NKd9iVTMsMja .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nJ50NKd9iVTMsMja .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nJ50NKd9iVTMsMja .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nJ50NKd9iVTMsMja .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nJ50NKd9iVTMsMja .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nJ50NKd9iVTMsMja .marker.cross{stroke:#333333;}#mermaid-svg-nJ50NKd9iVTMsMja svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nJ50NKd9iVTMsMja p{margin:0;}#mermaid-svg-nJ50NKd9iVTMsMja .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-nJ50NKd9iVTMsMja .cluster-label text{fill:#333;}#mermaid-svg-nJ50NKd9iVTMsMja .cluster-label span{color:#333;}#mermaid-svg-nJ50NKd9iVTMsMja .cluster-label span p{background-color:transparent;}#mermaid-svg-nJ50NKd9iVTMsMja .label text,#mermaid-svg-nJ50NKd9iVTMsMja span{fill:#333;color:#333;}#mermaid-svg-nJ50NKd9iVTMsMja .node rect,#mermaid-svg-nJ50NKd9iVTMsMja .node circle,#mermaid-svg-nJ50NKd9iVTMsMja .node ellipse,#mermaid-svg-nJ50NKd9iVTMsMja .node polygon,#mermaid-svg-nJ50NKd9iVTMsMja .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-nJ50NKd9iVTMsMja .rough-node .label text,#mermaid-svg-nJ50NKd9iVTMsMja .node .label text,#mermaid-svg-nJ50NKd9iVTMsMja .image-shape .label,#mermaid-svg-nJ50NKd9iVTMsMja .icon-shape .label{text-anchor:middle;}#mermaid-svg-nJ50NKd9iVTMsMja .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-nJ50NKd9iVTMsMja .rough-node .label,#mermaid-svg-nJ50NKd9iVTMsMja .node .label,#mermaid-svg-nJ50NKd9iVTMsMja .image-shape .label,#mermaid-svg-nJ50NKd9iVTMsMja .icon-shape .label{text-align:center;}#mermaid-svg-nJ50NKd9iVTMsMja .node.clickable{cursor:pointer;}#mermaid-svg-nJ50NKd9iVTMsMja .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-nJ50NKd9iVTMsMja .arrowheadPath{fill:#333333;}#mermaid-svg-nJ50NKd9iVTMsMja .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-nJ50NKd9iVTMsMja .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-nJ50NKd9iVTMsMja .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nJ50NKd9iVTMsMja .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-nJ50NKd9iVTMsMja .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nJ50NKd9iVTMsMja .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-nJ50NKd9iVTMsMja .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-nJ50NKd9iVTMsMja .cluster text{fill:#333;}#mermaid-svg-nJ50NKd9iVTMsMja .cluster span{color:#333;}#mermaid-svg-nJ50NKd9iVTMsMja 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-nJ50NKd9iVTMsMja .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-nJ50NKd9iVTMsMja rect.text{fill:none;stroke-width:0;}#mermaid-svg-nJ50NKd9iVTMsMja .icon-shape,#mermaid-svg-nJ50NKd9iVTMsMja .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-nJ50NKd9iVTMsMja .icon-shape p,#mermaid-svg-nJ50NKd9iVTMsMja .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-nJ50NKd9iVTMsMja .icon-shape .label rect,#mermaid-svg-nJ50NKd9iVTMsMja .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-nJ50NKd9iVTMsMja .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-nJ50NKd9iVTMsMja .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-nJ50NKd9iVTMsMja :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} memory-skill 边
_memory_skill_edges()
匹配记忆内容
与技能描述
内容相关则创建边
词汇重叠边 (隐式)
是
否
提取两个技能的
description 关键词
计算词汇重叠度
重叠度 > 阈值?
创建边
不创建
related_skills 边 (显式)
SKILL.md 中声明
related_skills: a, b, c
直接创建边
11.4 _memory_cards 与 _memory_skill_edges
_memory_cards() 函数从 MEMORY.md 和 USER.md 中提取记忆卡片(结构化的记忆条目),_memory_skill_edges() 则通过语义匹配将记忆卡片与技能关联:
#mermaid-svg-bIjNb7cexG2D2gY2{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-bIjNb7cexG2D2gY2 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bIjNb7cexG2D2gY2 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bIjNb7cexG2D2gY2 .error-icon{fill:#552222;}#mermaid-svg-bIjNb7cexG2D2gY2 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bIjNb7cexG2D2gY2 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bIjNb7cexG2D2gY2 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bIjNb7cexG2D2gY2 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bIjNb7cexG2D2gY2 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bIjNb7cexG2D2gY2 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bIjNb7cexG2D2gY2 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bIjNb7cexG2D2gY2 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bIjNb7cexG2D2gY2 .marker.cross{stroke:#333333;}#mermaid-svg-bIjNb7cexG2D2gY2 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bIjNb7cexG2D2gY2 p{margin:0;}#mermaid-svg-bIjNb7cexG2D2gY2 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bIjNb7cexG2D2gY2 .cluster-label text{fill:#333;}#mermaid-svg-bIjNb7cexG2D2gY2 .cluster-label span{color:#333;}#mermaid-svg-bIjNb7cexG2D2gY2 .cluster-label span p{background-color:transparent;}#mermaid-svg-bIjNb7cexG2D2gY2 .label text,#mermaid-svg-bIjNb7cexG2D2gY2 span{fill:#333;color:#333;}#mermaid-svg-bIjNb7cexG2D2gY2 .node rect,#mermaid-svg-bIjNb7cexG2D2gY2 .node circle,#mermaid-svg-bIjNb7cexG2D2gY2 .node ellipse,#mermaid-svg-bIjNb7cexG2D2gY2 .node polygon,#mermaid-svg-bIjNb7cexG2D2gY2 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bIjNb7cexG2D2gY2 .rough-node .label text,#mermaid-svg-bIjNb7cexG2D2gY2 .node .label text,#mermaid-svg-bIjNb7cexG2D2gY2 .image-shape .label,#mermaid-svg-bIjNb7cexG2D2gY2 .icon-shape .label{text-anchor:middle;}#mermaid-svg-bIjNb7cexG2D2gY2 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-bIjNb7cexG2D2gY2 .rough-node .label,#mermaid-svg-bIjNb7cexG2D2gY2 .node .label,#mermaid-svg-bIjNb7cexG2D2gY2 .image-shape .label,#mermaid-svg-bIjNb7cexG2D2gY2 .icon-shape .label{text-align:center;}#mermaid-svg-bIjNb7cexG2D2gY2 .node.clickable{cursor:pointer;}#mermaid-svg-bIjNb7cexG2D2gY2 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-bIjNb7cexG2D2gY2 .arrowheadPath{fill:#333333;}#mermaid-svg-bIjNb7cexG2D2gY2 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bIjNb7cexG2D2gY2 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bIjNb7cexG2D2gY2 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bIjNb7cexG2D2gY2 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bIjNb7cexG2D2gY2 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bIjNb7cexG2D2gY2 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-bIjNb7cexG2D2gY2 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bIjNb7cexG2D2gY2 .cluster text{fill:#333;}#mermaid-svg-bIjNb7cexG2D2gY2 .cluster span{color:#333;}#mermaid-svg-bIjNb7cexG2D2gY2 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-bIjNb7cexG2D2gY2 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bIjNb7cexG2D2gY2 rect.text{fill:none;stroke-width:0;}#mermaid-svg-bIjNb7cexG2D2gY2 .icon-shape,#mermaid-svg-bIjNb7cexG2D2gY2 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bIjNb7cexG2D2gY2 .icon-shape p,#mermaid-svg-bIjNb7cexG2D2gY2 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-bIjNb7cexG2D2gY2 .icon-shape .label rect,#mermaid-svg-bIjNb7cexG2D2gY2 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bIjNb7cexG2D2gY2 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-bIjNb7cexG2D2gY2 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-bIjNb7cexG2D2gY2 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 记忆-技能关联
是
否
_memory_cards()
解析 MEMORY.md
提取记忆条目
(类型, 内容, 标签)
_memory_skill_edges()
对每条记忆:
扫描全部技能
记忆内容与
技能描述语义相关?
创建 memory-skill 边
跳过
11.5 build_learning_graph 与 density_stats
build_learning_graph() 是图谱构建的入口函数,它遍历全部技能和记忆,构建完整的图谱。density_stats() 则计算图谱的密度统计:
- 节点密度:每类节点的数量
- 边密度:每类边的数量
- 连通性:最大连通分量的大小
- 孤立节点:没有任何边的节点数量
这些统计帮助用户了解知识库的"健康度"------高密度的图谱意味着技能之间有丰富的关联,低密度则可能意味着技能过于碎片化(需要 curator 合并)。
十二、Journey 节点编辑系统
学习图谱不仅是只读的可视化------用户可以通过 Journey 节点编辑系统 对图谱中的节点进行编辑和删除。agent/learning_mutations.py 实现了这套编辑系统。
12.1 Journey 节点概念
Journey 节点是学习图谱中用户可编辑的节点。不是所有节点都是 Journey 节点------技能节点由系统管理,但用户可以编辑其"journey"属性(如学习笔记、个人标注)。
#mermaid-svg-2Ovr2ANYS6mOUAvQ{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-2Ovr2ANYS6mOUAvQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .error-icon{fill:#552222;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .marker.cross{stroke:#333333;}#mermaid-svg-2Ovr2ANYS6mOUAvQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2Ovr2ANYS6mOUAvQ p{margin:0;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .cluster-label text{fill:#333;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .cluster-label span{color:#333;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .cluster-label span p{background-color:transparent;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .label text,#mermaid-svg-2Ovr2ANYS6mOUAvQ span{fill:#333;color:#333;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .node rect,#mermaid-svg-2Ovr2ANYS6mOUAvQ .node circle,#mermaid-svg-2Ovr2ANYS6mOUAvQ .node ellipse,#mermaid-svg-2Ovr2ANYS6mOUAvQ .node polygon,#mermaid-svg-2Ovr2ANYS6mOUAvQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .rough-node .label text,#mermaid-svg-2Ovr2ANYS6mOUAvQ .node .label text,#mermaid-svg-2Ovr2ANYS6mOUAvQ .image-shape .label,#mermaid-svg-2Ovr2ANYS6mOUAvQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .rough-node .label,#mermaid-svg-2Ovr2ANYS6mOUAvQ .node .label,#mermaid-svg-2Ovr2ANYS6mOUAvQ .image-shape .label,#mermaid-svg-2Ovr2ANYS6mOUAvQ .icon-shape .label{text-align:center;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .node.clickable{cursor:pointer;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .arrowheadPath{fill:#333333;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-2Ovr2ANYS6mOUAvQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2Ovr2ANYS6mOUAvQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-2Ovr2ANYS6mOUAvQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .cluster text{fill:#333;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .cluster span{color:#333;}#mermaid-svg-2Ovr2ANYS6mOUAvQ 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-2Ovr2ANYS6mOUAvQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-2Ovr2ANYS6mOUAvQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .icon-shape,#mermaid-svg-2Ovr2ANYS6mOUAvQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .icon-shape p,#mermaid-svg-2Ovr2ANYS6mOUAvQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .icon-shape .label rect,#mermaid-svg-2Ovr2ANYS6mOUAvQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2Ovr2ANYS6mOUAvQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-2Ovr2ANYS6mOUAvQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-2Ovr2ANYS6mOUAvQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Journey 节点编辑能力
skill
memory
查看节点详情
node_detail()
节点类型?
显示技能详情
-
journey 属性
显示记忆详情 -
journey 属性
用户编辑
edit_node()
更新 journey 属性
delete_node()
删除 journey 节点
12.2 parse_node_kind 与 _locate_memory
#mermaid-svg-pbl2aXzxo7AKaZbL{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-pbl2aXzxo7AKaZbL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pbl2aXzxo7AKaZbL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pbl2aXzxo7AKaZbL .error-icon{fill:#552222;}#mermaid-svg-pbl2aXzxo7AKaZbL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pbl2aXzxo7AKaZbL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pbl2aXzxo7AKaZbL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pbl2aXzxo7AKaZbL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pbl2aXzxo7AKaZbL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pbl2aXzxo7AKaZbL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pbl2aXzxo7AKaZbL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pbl2aXzxo7AKaZbL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pbl2aXzxo7AKaZbL .marker.cross{stroke:#333333;}#mermaid-svg-pbl2aXzxo7AKaZbL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pbl2aXzxo7AKaZbL p{margin:0;}#mermaid-svg-pbl2aXzxo7AKaZbL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pbl2aXzxo7AKaZbL .cluster-label text{fill:#333;}#mermaid-svg-pbl2aXzxo7AKaZbL .cluster-label span{color:#333;}#mermaid-svg-pbl2aXzxo7AKaZbL .cluster-label span p{background-color:transparent;}#mermaid-svg-pbl2aXzxo7AKaZbL .label text,#mermaid-svg-pbl2aXzxo7AKaZbL span{fill:#333;color:#333;}#mermaid-svg-pbl2aXzxo7AKaZbL .node rect,#mermaid-svg-pbl2aXzxo7AKaZbL .node circle,#mermaid-svg-pbl2aXzxo7AKaZbL .node ellipse,#mermaid-svg-pbl2aXzxo7AKaZbL .node polygon,#mermaid-svg-pbl2aXzxo7AKaZbL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pbl2aXzxo7AKaZbL .rough-node .label text,#mermaid-svg-pbl2aXzxo7AKaZbL .node .label text,#mermaid-svg-pbl2aXzxo7AKaZbL .image-shape .label,#mermaid-svg-pbl2aXzxo7AKaZbL .icon-shape .label{text-anchor:middle;}#mermaid-svg-pbl2aXzxo7AKaZbL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pbl2aXzxo7AKaZbL .rough-node .label,#mermaid-svg-pbl2aXzxo7AKaZbL .node .label,#mermaid-svg-pbl2aXzxo7AKaZbL .image-shape .label,#mermaid-svg-pbl2aXzxo7AKaZbL .icon-shape .label{text-align:center;}#mermaid-svg-pbl2aXzxo7AKaZbL .node.clickable{cursor:pointer;}#mermaid-svg-pbl2aXzxo7AKaZbL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pbl2aXzxo7AKaZbL .arrowheadPath{fill:#333333;}#mermaid-svg-pbl2aXzxo7AKaZbL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pbl2aXzxo7AKaZbL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pbl2aXzxo7AKaZbL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pbl2aXzxo7AKaZbL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pbl2aXzxo7AKaZbL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pbl2aXzxo7AKaZbL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pbl2aXzxo7AKaZbL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pbl2aXzxo7AKaZbL .cluster text{fill:#333;}#mermaid-svg-pbl2aXzxo7AKaZbL .cluster span{color:#333;}#mermaid-svg-pbl2aXzxo7AKaZbL 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-pbl2aXzxo7AKaZbL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pbl2aXzxo7AKaZbL rect.text{fill:none;stroke-width:0;}#mermaid-svg-pbl2aXzxo7AKaZbL .icon-shape,#mermaid-svg-pbl2aXzxo7AKaZbL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pbl2aXzxo7AKaZbL .icon-shape p,#mermaid-svg-pbl2aXzxo7AKaZbL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pbl2aXzxo7AKaZbL .icon-shape .label rect,#mermaid-svg-pbl2aXzxo7AKaZbL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pbl2aXzxo7AKaZbL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pbl2aXzxo7AKaZbL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pbl2aXzxo7AKaZbL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 节点定位流程
skill
memory
用户请求编辑节点
parse_node_kind()
解析节点类型
节点类型?
在 skills/ 中定位
_locate_memory()
在 MEMORY.md 中定位
返回节点引用
执行编辑操作
12.3 edit_node 操作
edit_node() 允许用户修改 Journey 节点的属性:
- 更新 journey 笔记:用户可以为技能或记忆添加个人笔记
- 更新标签:用户可以修改节点的标签,影响图谱的边构建
- 更新关联 :用户可以手动添加或移除
related_skills
12.4 delete_node 操作
delete_node() 允许用户删除 Journey 节点。删除操作的行为取决于节点类型:
| 节点类型 | delete_node 行为 |
|---|---|
| skill | 归档技能(不删除文件) |
| memory | 从 MEMORY.md 中移除条目 |
| journey 笔记 | 删除笔记本身 |
关键设计 :删除技能节点实际上是归档而非删除------这与 curator 的归档行为一致。系统永远不会因为用户的一次操作而永久删除知识。
十三、技能账本与回滚
技能账本是自我进化系统的审计核心 ------它记录了技能库的每一次变更,使得每个操作都是可追溯和可回滚的。tools/skill_ledger.py 实现了完整的账本系统。
13.1 账本结构
#mermaid-svg-W39a7FfVdhBDIdMy{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-W39a7FfVdhBDIdMy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-W39a7FfVdhBDIdMy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-W39a7FfVdhBDIdMy .error-icon{fill:#552222;}#mermaid-svg-W39a7FfVdhBDIdMy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-W39a7FfVdhBDIdMy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-W39a7FfVdhBDIdMy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-W39a7FfVdhBDIdMy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-W39a7FfVdhBDIdMy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-W39a7FfVdhBDIdMy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-W39a7FfVdhBDIdMy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-W39a7FfVdhBDIdMy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-W39a7FfVdhBDIdMy .marker.cross{stroke:#333333;}#mermaid-svg-W39a7FfVdhBDIdMy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-W39a7FfVdhBDIdMy p{margin:0;}#mermaid-svg-W39a7FfVdhBDIdMy .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-W39a7FfVdhBDIdMy .cluster-label text{fill:#333;}#mermaid-svg-W39a7FfVdhBDIdMy .cluster-label span{color:#333;}#mermaid-svg-W39a7FfVdhBDIdMy .cluster-label span p{background-color:transparent;}#mermaid-svg-W39a7FfVdhBDIdMy .label text,#mermaid-svg-W39a7FfVdhBDIdMy span{fill:#333;color:#333;}#mermaid-svg-W39a7FfVdhBDIdMy .node rect,#mermaid-svg-W39a7FfVdhBDIdMy .node circle,#mermaid-svg-W39a7FfVdhBDIdMy .node ellipse,#mermaid-svg-W39a7FfVdhBDIdMy .node polygon,#mermaid-svg-W39a7FfVdhBDIdMy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-W39a7FfVdhBDIdMy .rough-node .label text,#mermaid-svg-W39a7FfVdhBDIdMy .node .label text,#mermaid-svg-W39a7FfVdhBDIdMy .image-shape .label,#mermaid-svg-W39a7FfVdhBDIdMy .icon-shape .label{text-anchor:middle;}#mermaid-svg-W39a7FfVdhBDIdMy .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-W39a7FfVdhBDIdMy .rough-node .label,#mermaid-svg-W39a7FfVdhBDIdMy .node .label,#mermaid-svg-W39a7FfVdhBDIdMy .image-shape .label,#mermaid-svg-W39a7FfVdhBDIdMy .icon-shape .label{text-align:center;}#mermaid-svg-W39a7FfVdhBDIdMy .node.clickable{cursor:pointer;}#mermaid-svg-W39a7FfVdhBDIdMy .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-W39a7FfVdhBDIdMy .arrowheadPath{fill:#333333;}#mermaid-svg-W39a7FfVdhBDIdMy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-W39a7FfVdhBDIdMy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-W39a7FfVdhBDIdMy .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-W39a7FfVdhBDIdMy .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-W39a7FfVdhBDIdMy .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-W39a7FfVdhBDIdMy .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-W39a7FfVdhBDIdMy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-W39a7FfVdhBDIdMy .cluster text{fill:#333;}#mermaid-svg-W39a7FfVdhBDIdMy .cluster span{color:#333;}#mermaid-svg-W39a7FfVdhBDIdMy 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-W39a7FfVdhBDIdMy .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-W39a7FfVdhBDIdMy rect.text{fill:none;stroke-width:0;}#mermaid-svg-W39a7FfVdhBDIdMy .icon-shape,#mermaid-svg-W39a7FfVdhBDIdMy .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-W39a7FfVdhBDIdMy .icon-shape p,#mermaid-svg-W39a7FfVdhBDIdMy .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-W39a7FfVdhBDIdMy .icon-shape .label rect,#mermaid-svg-W39a7FfVdhBDIdMy .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-W39a7FfVdhBDIdMy .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-W39a7FfVdhBDIdMy .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-W39a7FfVdhBDIdMy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 技能账本架构
每条账本记录
blob_hash
prev_blob_hash
{
timestamp,
actor (curator/review/learn),
action (create/patch/merge/archive),
skill_name,
blob_hash,
prev_blob_hash,
metadata
}
.curator_ledger.jsonl
(追加写入日志)
blobs/
(内容寻址存储)
13.2 内容寻址存储
每次技能变更的完整内容都被存储为 blob------以 SHA-256 哈希命名的文件:
#mermaid-svg-Q6pxY1dLtMF4GVqF{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-Q6pxY1dLtMF4GVqF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Q6pxY1dLtMF4GVqF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Q6pxY1dLtMF4GVqF .error-icon{fill:#552222;}#mermaid-svg-Q6pxY1dLtMF4GVqF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Q6pxY1dLtMF4GVqF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Q6pxY1dLtMF4GVqF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Q6pxY1dLtMF4GVqF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Q6pxY1dLtMF4GVqF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Q6pxY1dLtMF4GVqF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Q6pxY1dLtMF4GVqF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Q6pxY1dLtMF4GVqF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Q6pxY1dLtMF4GVqF .marker.cross{stroke:#333333;}#mermaid-svg-Q6pxY1dLtMF4GVqF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Q6pxY1dLtMF4GVqF p{margin:0;}#mermaid-svg-Q6pxY1dLtMF4GVqF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Q6pxY1dLtMF4GVqF .cluster-label text{fill:#333;}#mermaid-svg-Q6pxY1dLtMF4GVqF .cluster-label span{color:#333;}#mermaid-svg-Q6pxY1dLtMF4GVqF .cluster-label span p{background-color:transparent;}#mermaid-svg-Q6pxY1dLtMF4GVqF .label text,#mermaid-svg-Q6pxY1dLtMF4GVqF span{fill:#333;color:#333;}#mermaid-svg-Q6pxY1dLtMF4GVqF .node rect,#mermaid-svg-Q6pxY1dLtMF4GVqF .node circle,#mermaid-svg-Q6pxY1dLtMF4GVqF .node ellipse,#mermaid-svg-Q6pxY1dLtMF4GVqF .node polygon,#mermaid-svg-Q6pxY1dLtMF4GVqF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Q6pxY1dLtMF4GVqF .rough-node .label text,#mermaid-svg-Q6pxY1dLtMF4GVqF .node .label text,#mermaid-svg-Q6pxY1dLtMF4GVqF .image-shape .label,#mermaid-svg-Q6pxY1dLtMF4GVqF .icon-shape .label{text-anchor:middle;}#mermaid-svg-Q6pxY1dLtMF4GVqF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Q6pxY1dLtMF4GVqF .rough-node .label,#mermaid-svg-Q6pxY1dLtMF4GVqF .node .label,#mermaid-svg-Q6pxY1dLtMF4GVqF .image-shape .label,#mermaid-svg-Q6pxY1dLtMF4GVqF .icon-shape .label{text-align:center;}#mermaid-svg-Q6pxY1dLtMF4GVqF .node.clickable{cursor:pointer;}#mermaid-svg-Q6pxY1dLtMF4GVqF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Q6pxY1dLtMF4GVqF .arrowheadPath{fill:#333333;}#mermaid-svg-Q6pxY1dLtMF4GVqF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Q6pxY1dLtMF4GVqF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Q6pxY1dLtMF4GVqF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Q6pxY1dLtMF4GVqF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Q6pxY1dLtMF4GVqF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Q6pxY1dLtMF4GVqF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Q6pxY1dLtMF4GVqF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Q6pxY1dLtMF4GVqF .cluster text{fill:#333;}#mermaid-svg-Q6pxY1dLtMF4GVqF .cluster span{color:#333;}#mermaid-svg-Q6pxY1dLtMF4GVqF 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-Q6pxY1dLtMF4GVqF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Q6pxY1dLtMF4GVqF rect.text{fill:none;stroke-width:0;}#mermaid-svg-Q6pxY1dLtMF4GVqF .icon-shape,#mermaid-svg-Q6pxY1dLtMF4GVqF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Q6pxY1dLtMF4GVqF .icon-shape p,#mermaid-svg-Q6pxY1dLtMF4GVqF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Q6pxY1dLtMF4GVqF .icon-shape .label rect,#mermaid-svg-Q6pxY1dLtMF4GVqF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Q6pxY1dLtMF4GVqF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Q6pxY1dLtMF4GVqF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Q6pxY1dLtMF4GVqF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 去重优势
内容寻址存储
技能变更前内容
计算 SHA-256
存储为 blobs/sha256...
账本记录 blob_hash
技能变更后内容
计算 SHA-256
存储为 blobs/sha256...
账本记录新 blob_hash
相同内容 → 相同哈希
自动去重
节省存储空间
为什么用内容寻址?因为技能变更经常有大量重复内容------一次 patch 可能只改了几行,但传统存储会保存整个文件。内容寻址通过哈希去重,相同内容只存一份,大幅节省存储空间。
13.3 actor 识别
账本记录了每次变更的 actor(操作者),区分不同来源的变更:
| actor | 含义 | 触发方式 |
|---|---|---|
curator |
策展器变更 | 定时 curator.run() |
review |
后台审查变更 | nudge 触发的 fork |
learn |
主动学习变更 | /learn 命令 |
manual |
手动变更 | 用户直接 skill_manage |
13.4 回滚机制
#mermaid-svg-YbhMpJoPF7xnlZyq{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-YbhMpJoPF7xnlZyq .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YbhMpJoPF7xnlZyq .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YbhMpJoPF7xnlZyq .error-icon{fill:#552222;}#mermaid-svg-YbhMpJoPF7xnlZyq .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YbhMpJoPF7xnlZyq .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YbhMpJoPF7xnlZyq .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YbhMpJoPF7xnlZyq .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YbhMpJoPF7xnlZyq .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YbhMpJoPF7xnlZyq .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YbhMpJoPF7xnlZyq .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YbhMpJoPF7xnlZyq .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YbhMpJoPF7xnlZyq .marker.cross{stroke:#333333;}#mermaid-svg-YbhMpJoPF7xnlZyq svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YbhMpJoPF7xnlZyq p{margin:0;}#mermaid-svg-YbhMpJoPF7xnlZyq .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YbhMpJoPF7xnlZyq .cluster-label text{fill:#333;}#mermaid-svg-YbhMpJoPF7xnlZyq .cluster-label span{color:#333;}#mermaid-svg-YbhMpJoPF7xnlZyq .cluster-label span p{background-color:transparent;}#mermaid-svg-YbhMpJoPF7xnlZyq .label text,#mermaid-svg-YbhMpJoPF7xnlZyq span{fill:#333;color:#333;}#mermaid-svg-YbhMpJoPF7xnlZyq .node rect,#mermaid-svg-YbhMpJoPF7xnlZyq .node circle,#mermaid-svg-YbhMpJoPF7xnlZyq .node ellipse,#mermaid-svg-YbhMpJoPF7xnlZyq .node polygon,#mermaid-svg-YbhMpJoPF7xnlZyq .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YbhMpJoPF7xnlZyq .rough-node .label text,#mermaid-svg-YbhMpJoPF7xnlZyq .node .label text,#mermaid-svg-YbhMpJoPF7xnlZyq .image-shape .label,#mermaid-svg-YbhMpJoPF7xnlZyq .icon-shape .label{text-anchor:middle;}#mermaid-svg-YbhMpJoPF7xnlZyq .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YbhMpJoPF7xnlZyq .rough-node .label,#mermaid-svg-YbhMpJoPF7xnlZyq .node .label,#mermaid-svg-YbhMpJoPF7xnlZyq .image-shape .label,#mermaid-svg-YbhMpJoPF7xnlZyq .icon-shape .label{text-align:center;}#mermaid-svg-YbhMpJoPF7xnlZyq .node.clickable{cursor:pointer;}#mermaid-svg-YbhMpJoPF7xnlZyq .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YbhMpJoPF7xnlZyq .arrowheadPath{fill:#333333;}#mermaid-svg-YbhMpJoPF7xnlZyq .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YbhMpJoPF7xnlZyq .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YbhMpJoPF7xnlZyq .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YbhMpJoPF7xnlZyq .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YbhMpJoPF7xnlZyq .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YbhMpJoPF7xnlZyq .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YbhMpJoPF7xnlZyq .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YbhMpJoPF7xnlZyq .cluster text{fill:#333;}#mermaid-svg-YbhMpJoPF7xnlZyq .cluster span{color:#333;}#mermaid-svg-YbhMpJoPF7xnlZyq 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-YbhMpJoPF7xnlZyq .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YbhMpJoPF7xnlZyq rect.text{fill:none;stroke-width:0;}#mermaid-svg-YbhMpJoPF7xnlZyq .icon-shape,#mermaid-svg-YbhMpJoPF7xnlZyq .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YbhMpJoPF7xnlZyq .icon-shape p,#mermaid-svg-YbhMpJoPF7xnlZyq .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YbhMpJoPF7xnlZyq .icon-shape .label rect,#mermaid-svg-YbhMpJoPF7xnlZyq .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YbhMpJoPF7xnlZyq .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YbhMpJoPF7xnlZyq .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YbhMpJoPF7xnlZyq :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 完整包恢复
需要恢复整个技能
查找该技能的
全部账本记录
找到目标版本的 blob_hash
从 blobs/ 恢复完整包
写回技能目录
单编辑回滚 (FAIL CLOSED)
发现某次变更有问题
查找账本记录
获取 prev_blob_hash
从 blobs/ 恢复内容
写回技能文件
记录回滚操作到账本
FAIL CLOSED 原则 :回滚操作在遇到任何错误时都会失败而非部分恢复------要么完全恢复到目标版本,要么保持当前状态不变。这避免了"半恢复"导致的数据不一致。
13.5 审计查询
账本支持多种审计查询:
- 按时间范围:查询某时间段内的所有变更
- 按 actor:查询某类操作者的所有变更
- 按技能:查询某技能的完整变更历史
- 按 action:查询某类操作(如所有 merge 操作)
这些查询使得技能库的每一次变更都是透明和可审计的------用户可以随时了解"谁在什么时候对什么技能做了什么操作"。
十四、审查引擎
审查引擎(agent/review_engine.py)实现了 /review 命令------允许用户手动触发 对当前会话的审查。这与后台审查 fork 不同:后台审查是自动的、异步的、受限的;/review 是手动的、同步的、全权限的。
14.1 /review 与后台审查的对比
#mermaid-svg-dXLfv2YNpjnrp62l{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-dXLfv2YNpjnrp62l .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dXLfv2YNpjnrp62l .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dXLfv2YNpjnrp62l .error-icon{fill:#552222;}#mermaid-svg-dXLfv2YNpjnrp62l .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dXLfv2YNpjnrp62l .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dXLfv2YNpjnrp62l .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dXLfv2YNpjnrp62l .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dXLfv2YNpjnrp62l .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dXLfv2YNpjnrp62l .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dXLfv2YNpjnrp62l .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dXLfv2YNpjnrp62l .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dXLfv2YNpjnrp62l .marker.cross{stroke:#333333;}#mermaid-svg-dXLfv2YNpjnrp62l svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dXLfv2YNpjnrp62l p{margin:0;}#mermaid-svg-dXLfv2YNpjnrp62l .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dXLfv2YNpjnrp62l .cluster-label text{fill:#333;}#mermaid-svg-dXLfv2YNpjnrp62l .cluster-label span{color:#333;}#mermaid-svg-dXLfv2YNpjnrp62l .cluster-label span p{background-color:transparent;}#mermaid-svg-dXLfv2YNpjnrp62l .label text,#mermaid-svg-dXLfv2YNpjnrp62l span{fill:#333;color:#333;}#mermaid-svg-dXLfv2YNpjnrp62l .node rect,#mermaid-svg-dXLfv2YNpjnrp62l .node circle,#mermaid-svg-dXLfv2YNpjnrp62l .node ellipse,#mermaid-svg-dXLfv2YNpjnrp62l .node polygon,#mermaid-svg-dXLfv2YNpjnrp62l .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dXLfv2YNpjnrp62l .rough-node .label text,#mermaid-svg-dXLfv2YNpjnrp62l .node .label text,#mermaid-svg-dXLfv2YNpjnrp62l .image-shape .label,#mermaid-svg-dXLfv2YNpjnrp62l .icon-shape .label{text-anchor:middle;}#mermaid-svg-dXLfv2YNpjnrp62l .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-dXLfv2YNpjnrp62l .rough-node .label,#mermaid-svg-dXLfv2YNpjnrp62l .node .label,#mermaid-svg-dXLfv2YNpjnrp62l .image-shape .label,#mermaid-svg-dXLfv2YNpjnrp62l .icon-shape .label{text-align:center;}#mermaid-svg-dXLfv2YNpjnrp62l .node.clickable{cursor:pointer;}#mermaid-svg-dXLfv2YNpjnrp62l .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-dXLfv2YNpjnrp62l .arrowheadPath{fill:#333333;}#mermaid-svg-dXLfv2YNpjnrp62l .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dXLfv2YNpjnrp62l .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dXLfv2YNpjnrp62l .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dXLfv2YNpjnrp62l .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dXLfv2YNpjnrp62l .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dXLfv2YNpjnrp62l .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-dXLfv2YNpjnrp62l .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dXLfv2YNpjnrp62l .cluster text{fill:#333;}#mermaid-svg-dXLfv2YNpjnrp62l .cluster span{color:#333;}#mermaid-svg-dXLfv2YNpjnrp62l 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-dXLfv2YNpjnrp62l .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dXLfv2YNpjnrp62l rect.text{fill:none;stroke-width:0;}#mermaid-svg-dXLfv2YNpjnrp62l .icon-shape,#mermaid-svg-dXLfv2YNpjnrp62l .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dXLfv2YNpjnrp62l .icon-shape p,#mermaid-svg-dXLfv2YNpjnrp62l .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-dXLfv2YNpjnrp62l .icon-shape .label rect,#mermaid-svg-dXLfv2YNpjnrp62l .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dXLfv2YNpjnrp62l .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-dXLfv2YNpjnrp62l .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-dXLfv2YNpjnrp62l :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} /review (手动)
触发: 用户输入 /review
执行: 当前代理 (无 fork)
权限: 全部工具
模式: 同步, 不可取消
提示词: review_engine 构建
后台审查 (自动)
触发: nudge 计数器
执行: cache-parity fork
权限: 仅 skill_manage + memory + read_file
模式: 异步, 可取消
提示词: _SKILL_REVIEW_PROMPT 等
14.2 /review 的使用场景
| 场景 | 说明 |
|---|---|
| 用户觉得会话有价值 | 主动触发审查,确保知识被捕获 |
| 后台审查被取消 | 用户注意到审查未完成,手动补跑 |
| 用户想审查特定方面 | /review 可以指定审查重点 |
| 调试自我进化系统 | 用户想观察审查过程 |
14.3 审查引擎的输出
/review 的输出与后台审查类似------一个动作摘要,列出本次审查创建或更新了哪些技能和记忆。但由于 /review 拥有全部工具权限,它可以执行更复杂的操作(如读取多个文件进行交叉验证)。
十五、洞察引擎
洞察引擎(agent/insights.py)是自我进化系统的分析层------它通过 SQLite 聚合统计,从技能使用遥测数据中提取高层次的洞察,帮助用户和系统理解知识库的使用模式和进化趋势。
15.1 洞察引擎架构
#mermaid-svg-tFfelgsRM3oJ5IkA{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-tFfelgsRM3oJ5IkA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tFfelgsRM3oJ5IkA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tFfelgsRM3oJ5IkA .error-icon{fill:#552222;}#mermaid-svg-tFfelgsRM3oJ5IkA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tFfelgsRM3oJ5IkA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tFfelgsRM3oJ5IkA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tFfelgsRM3oJ5IkA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tFfelgsRM3oJ5IkA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tFfelgsRM3oJ5IkA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tFfelgsRM3oJ5IkA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tFfelgsRM3oJ5IkA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tFfelgsRM3oJ5IkA .marker.cross{stroke:#333333;}#mermaid-svg-tFfelgsRM3oJ5IkA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tFfelgsRM3oJ5IkA p{margin:0;}#mermaid-svg-tFfelgsRM3oJ5IkA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tFfelgsRM3oJ5IkA .cluster-label text{fill:#333;}#mermaid-svg-tFfelgsRM3oJ5IkA .cluster-label span{color:#333;}#mermaid-svg-tFfelgsRM3oJ5IkA .cluster-label span p{background-color:transparent;}#mermaid-svg-tFfelgsRM3oJ5IkA .label text,#mermaid-svg-tFfelgsRM3oJ5IkA span{fill:#333;color:#333;}#mermaid-svg-tFfelgsRM3oJ5IkA .node rect,#mermaid-svg-tFfelgsRM3oJ5IkA .node circle,#mermaid-svg-tFfelgsRM3oJ5IkA .node ellipse,#mermaid-svg-tFfelgsRM3oJ5IkA .node polygon,#mermaid-svg-tFfelgsRM3oJ5IkA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tFfelgsRM3oJ5IkA .rough-node .label text,#mermaid-svg-tFfelgsRM3oJ5IkA .node .label text,#mermaid-svg-tFfelgsRM3oJ5IkA .image-shape .label,#mermaid-svg-tFfelgsRM3oJ5IkA .icon-shape .label{text-anchor:middle;}#mermaid-svg-tFfelgsRM3oJ5IkA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tFfelgsRM3oJ5IkA .rough-node .label,#mermaid-svg-tFfelgsRM3oJ5IkA .node .label,#mermaid-svg-tFfelgsRM3oJ5IkA .image-shape .label,#mermaid-svg-tFfelgsRM3oJ5IkA .icon-shape .label{text-align:center;}#mermaid-svg-tFfelgsRM3oJ5IkA .node.clickable{cursor:pointer;}#mermaid-svg-tFfelgsRM3oJ5IkA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tFfelgsRM3oJ5IkA .arrowheadPath{fill:#333333;}#mermaid-svg-tFfelgsRM3oJ5IkA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tFfelgsRM3oJ5IkA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tFfelgsRM3oJ5IkA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tFfelgsRM3oJ5IkA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tFfelgsRM3oJ5IkA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tFfelgsRM3oJ5IkA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tFfelgsRM3oJ5IkA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tFfelgsRM3oJ5IkA .cluster text{fill:#333;}#mermaid-svg-tFfelgsRM3oJ5IkA .cluster span{color:#333;}#mermaid-svg-tFfelgsRM3oJ5IkA 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-tFfelgsRM3oJ5IkA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tFfelgsRM3oJ5IkA rect.text{fill:none;stroke-width:0;}#mermaid-svg-tFfelgsRM3oJ5IkA .icon-shape,#mermaid-svg-tFfelgsRM3oJ5IkA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tFfelgsRM3oJ5IkA .icon-shape p,#mermaid-svg-tFfelgsRM3oJ5IkA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tFfelgsRM3oJ5IkA .icon-shape .label rect,#mermaid-svg-tFfelgsRM3oJ5IkA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tFfelgsRM3oJ5IkA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tFfelgsRM3oJ5IkA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tFfelgsRM3oJ5IkA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 洞察引擎数据流
usage.json
(每个技能)
SQLite 聚合
curator_ledger.jsonl
(变更历史)
MEMORY.md
(记忆条目)
使用频率洞察
最常用/最不常用技能
进化趋势洞察
技能增长率, 合并率
健康度洞察
stale 比例, 孤立节点
时间模式洞察
使用时间分布
15.2 SQLite 聚合统计
洞察引擎使用 SQLite 作为聚合引擎,将分散的 usage.json 和账本数据加载到内存 SQLite 数据库中进行 SQL 查询:
#mermaid-svg-F8D9xHSSCF1bK10m{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-F8D9xHSSCF1bK10m .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-F8D9xHSSCF1bK10m .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-F8D9xHSSCF1bK10m .error-icon{fill:#552222;}#mermaid-svg-F8D9xHSSCF1bK10m .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-F8D9xHSSCF1bK10m .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-F8D9xHSSCF1bK10m .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-F8D9xHSSCF1bK10m .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-F8D9xHSSCF1bK10m .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-F8D9xHSSCF1bK10m .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-F8D9xHSSCF1bK10m .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-F8D9xHSSCF1bK10m .marker{fill:#333333;stroke:#333333;}#mermaid-svg-F8D9xHSSCF1bK10m .marker.cross{stroke:#333333;}#mermaid-svg-F8D9xHSSCF1bK10m svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-F8D9xHSSCF1bK10m p{margin:0;}#mermaid-svg-F8D9xHSSCF1bK10m .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-F8D9xHSSCF1bK10m .cluster-label text{fill:#333;}#mermaid-svg-F8D9xHSSCF1bK10m .cluster-label span{color:#333;}#mermaid-svg-F8D9xHSSCF1bK10m .cluster-label span p{background-color:transparent;}#mermaid-svg-F8D9xHSSCF1bK10m .label text,#mermaid-svg-F8D9xHSSCF1bK10m span{fill:#333;color:#333;}#mermaid-svg-F8D9xHSSCF1bK10m .node rect,#mermaid-svg-F8D9xHSSCF1bK10m .node circle,#mermaid-svg-F8D9xHSSCF1bK10m .node ellipse,#mermaid-svg-F8D9xHSSCF1bK10m .node polygon,#mermaid-svg-F8D9xHSSCF1bK10m .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-F8D9xHSSCF1bK10m .rough-node .label text,#mermaid-svg-F8D9xHSSCF1bK10m .node .label text,#mermaid-svg-F8D9xHSSCF1bK10m .image-shape .label,#mermaid-svg-F8D9xHSSCF1bK10m .icon-shape .label{text-anchor:middle;}#mermaid-svg-F8D9xHSSCF1bK10m .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-F8D9xHSSCF1bK10m .rough-node .label,#mermaid-svg-F8D9xHSSCF1bK10m .node .label,#mermaid-svg-F8D9xHSSCF1bK10m .image-shape .label,#mermaid-svg-F8D9xHSSCF1bK10m .icon-shape .label{text-align:center;}#mermaid-svg-F8D9xHSSCF1bK10m .node.clickable{cursor:pointer;}#mermaid-svg-F8D9xHSSCF1bK10m .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-F8D9xHSSCF1bK10m .arrowheadPath{fill:#333333;}#mermaid-svg-F8D9xHSSCF1bK10m .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-F8D9xHSSCF1bK10m .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-F8D9xHSSCF1bK10m .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-F8D9xHSSCF1bK10m .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-F8D9xHSSCF1bK10m .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-F8D9xHSSCF1bK10m .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-F8D9xHSSCF1bK10m .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-F8D9xHSSCF1bK10m .cluster text{fill:#333;}#mermaid-svg-F8D9xHSSCF1bK10m .cluster span{color:#333;}#mermaid-svg-F8D9xHSSCF1bK10m 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-F8D9xHSSCF1bK10m .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-F8D9xHSSCF1bK10m rect.text{fill:none;stroke-width:0;}#mermaid-svg-F8D9xHSSCF1bK10m .icon-shape,#mermaid-svg-F8D9xHSSCF1bK10m .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-F8D9xHSSCF1bK10m .icon-shape p,#mermaid-svg-F8D9xHSSCF1bK10m .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-F8D9xHSSCF1bK10m .icon-shape .label rect,#mermaid-svg-F8D9xHSSCF1bK10m .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-F8D9xHSSCF1bK10m .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-F8D9xHSSCF1bK10m .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-F8D9xHSSCF1bK10m :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SQLite 聚合流程
加载全部 usage.json
INSERT INTO skills
(name, used_count, status, ...)
加载 curator_ledger
INSERT INTO ledger
(timestamp, actor, action, ...)
执行聚合查询
返回洞察结果
为什么用 SQLite?因为聚合统计需要 JOIN、GROUP BY、ORDER BY 等关系操作,用 Python 手写这些逻辑既繁琐又易错。SQLite 是嵌入式数据库,无需额外服务,适合这种"加载-查询-丢弃"的临时聚合场景。
15.3 洞察类型
| 洞察类型 | 查询示例 | 价值 |
|---|---|---|
| 使用频率 | SELECT name, used_count FROM skills ORDER BY used_count DESC LIMIT 10 |
了解哪些技能最有价值 |
| 进化趋势 | SELECT DATE(timestamp), COUNT(*) FROM ledger GROUP BY DATE(timestamp) |
了解知识库增长速度 |
| 健康度 | SELECT status, COUNT(*) FROM skills GROUP BY status |
了解 stale/archived 比例 |
| 合并历史 | SELECT skill_name, COUNT(*) FROM ledger WHERE action='merge' GROUP BY skill_name |
了解哪些技能被合并过 |
| Actor 分布 | SELECT actor, COUNT(*) FROM ledger GROUP BY actor |
了解变更来源分布 |
15.4 洞察的应用
洞察引擎的输出被用于多个场景:
- 用户仪表盘 :用户可以通过
/insights命令查看知识库的统计洞察 - 策展器决策:curator 可以参考洞察数据决定合并优先级
- 学习图谱密度 :
density_stats()使用洞察数据计算图谱健康度 - 自我诊断:系统可以通过洞察数据发现异常(如突然大量技能变为 stale)
十六、压缩反馈系统
压缩反馈系统(agent/manual_compression_feedback.py)处理用户对记忆压缩的手动反馈------当系统自动压缩记忆时,用户可能不满意压缩结果,这个系统记录用户的反馈并指导未来的压缩行为。
16.1 压缩锁与跳过
#mermaid-svg-5KfjpYcWc2JGWhrC{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-5KfjpYcWc2JGWhrC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5KfjpYcWc2JGWhrC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5KfjpYcWc2JGWhrC .error-icon{fill:#552222;}#mermaid-svg-5KfjpYcWc2JGWhrC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5KfjpYcWc2JGWhrC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5KfjpYcWc2JGWhrC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5KfjpYcWc2JGWhrC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5KfjpYcWc2JGWhrC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5KfjpYcWc2JGWhrC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5KfjpYcWc2JGWhrC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5KfjpYcWc2JGWhrC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5KfjpYcWc2JGWhrC .marker.cross{stroke:#333333;}#mermaid-svg-5KfjpYcWc2JGWhrC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5KfjpYcWc2JGWhrC p{margin:0;}#mermaid-svg-5KfjpYcWc2JGWhrC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5KfjpYcWc2JGWhrC .cluster-label text{fill:#333;}#mermaid-svg-5KfjpYcWc2JGWhrC .cluster-label span{color:#333;}#mermaid-svg-5KfjpYcWc2JGWhrC .cluster-label span p{background-color:transparent;}#mermaid-svg-5KfjpYcWc2JGWhrC .label text,#mermaid-svg-5KfjpYcWc2JGWhrC span{fill:#333;color:#333;}#mermaid-svg-5KfjpYcWc2JGWhrC .node rect,#mermaid-svg-5KfjpYcWc2JGWhrC .node circle,#mermaid-svg-5KfjpYcWc2JGWhrC .node ellipse,#mermaid-svg-5KfjpYcWc2JGWhrC .node polygon,#mermaid-svg-5KfjpYcWc2JGWhrC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5KfjpYcWc2JGWhrC .rough-node .label text,#mermaid-svg-5KfjpYcWc2JGWhrC .node .label text,#mermaid-svg-5KfjpYcWc2JGWhrC .image-shape .label,#mermaid-svg-5KfjpYcWc2JGWhrC .icon-shape .label{text-anchor:middle;}#mermaid-svg-5KfjpYcWc2JGWhrC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5KfjpYcWc2JGWhrC .rough-node .label,#mermaid-svg-5KfjpYcWc2JGWhrC .node .label,#mermaid-svg-5KfjpYcWc2JGWhrC .image-shape .label,#mermaid-svg-5KfjpYcWc2JGWhrC .icon-shape .label{text-align:center;}#mermaid-svg-5KfjpYcWc2JGWhrC .node.clickable{cursor:pointer;}#mermaid-svg-5KfjpYcWc2JGWhrC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5KfjpYcWc2JGWhrC .arrowheadPath{fill:#333333;}#mermaid-svg-5KfjpYcWc2JGWhrC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5KfjpYcWc2JGWhrC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5KfjpYcWc2JGWhrC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5KfjpYcWc2JGWhrC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5KfjpYcWc2JGWhrC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5KfjpYcWc2JGWhrC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5KfjpYcWc2JGWhrC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5KfjpYcWc2JGWhrC .cluster text{fill:#333;}#mermaid-svg-5KfjpYcWc2JGWhrC .cluster span{color:#333;}#mermaid-svg-5KfjpYcWc2JGWhrC 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-5KfjpYcWc2JGWhrC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5KfjpYcWc2JGWhrC rect.text{fill:none;stroke-width:0;}#mermaid-svg-5KfjpYcWc2JGWhrC .icon-shape,#mermaid-svg-5KfjpYcWc2JGWhrC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5KfjpYcWc2JGWhrC .icon-shape p,#mermaid-svg-5KfjpYcWc2JGWhrC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5KfjpYcWc2JGWhrC .icon-shape .label rect,#mermaid-svg-5KfjpYcWc2JGWhrC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5KfjpYcWc2JGWhrC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5KfjpYcWc2JGWhrC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5KfjpYcWc2JGWhrC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 压缩反馈流程
满意
不满意
系统自动压缩记忆
用户查看压缩结果
用户满意?
正常流程
用户手动调整
describe_compression_lock_skip()
记录跳过原因
summarize_manual_compression()
总结手动压缩
反馈写入系统
指导未来压缩
16.2 describe_compression_lock_skip
当用户选择跳过系统压缩并手动处理时,describe_compression_lock_skip() 会记录跳过的原因:
- 压缩丢失了重要信息:用户认为系统压缩过于激进
- 压缩格式不符合偏好:用户希望保留原始格式
- 压缩时机不对:用户认为当前不应压缩
- 其他原因:用户自定义原因
这些反馈被系统记录,用于调整未来的压缩策略。
16.3 summarize_manual_compression
summarize_manual_compression() 总结用户的手动压缩行为,提取模式:
- 用户倾向于保留哪些类型的记忆:通过统计跳过的记忆类型
- 用户倾向于压缩哪些类型的记忆:通过统计手动压缩的记忆类型
- 用户的压缩偏好:格式、长度、结构等
这些总结被反馈到压缩提示词中,使系统的自动压缩逐渐适应用户的偏好------这是另一个自我进化的维度。
16.4 压缩反馈与自我进化的关系
压缩反馈系统体现了自我进化的一个重要原则:用户反馈是进化的驱动力。系统不是被动地按照固定规则压缩记忆,而是通过用户反馈不断调整压缩策略。这使得压缩行为会随着使用时间的增长而越来越符合用户的偏好。
十七、安全防护机制
自我进化系统处理的是"代理自己写入知识"------这天然带有安全风险。如果审查 fork 产生幻觉、被注入恶意指令、或简单地做出错误决策,可能会污染知识库。系统通过多层安全机制来防御这些风险。
17.1 安全防护层次
#mermaid-svg-CkyRjF4LsBUA801a{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-CkyRjF4LsBUA801a .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CkyRjF4LsBUA801a .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CkyRjF4LsBUA801a .error-icon{fill:#552222;}#mermaid-svg-CkyRjF4LsBUA801a .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CkyRjF4LsBUA801a .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CkyRjF4LsBUA801a .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CkyRjF4LsBUA801a .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CkyRjF4LsBUA801a .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CkyRjF4LsBUA801a .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CkyRjF4LsBUA801a .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CkyRjF4LsBUA801a .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CkyRjF4LsBUA801a .marker.cross{stroke:#333333;}#mermaid-svg-CkyRjF4LsBUA801a svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CkyRjF4LsBUA801a p{margin:0;}#mermaid-svg-CkyRjF4LsBUA801a .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-CkyRjF4LsBUA801a .cluster-label text{fill:#333;}#mermaid-svg-CkyRjF4LsBUA801a .cluster-label span{color:#333;}#mermaid-svg-CkyRjF4LsBUA801a .cluster-label span p{background-color:transparent;}#mermaid-svg-CkyRjF4LsBUA801a .label text,#mermaid-svg-CkyRjF4LsBUA801a span{fill:#333;color:#333;}#mermaid-svg-CkyRjF4LsBUA801a .node rect,#mermaid-svg-CkyRjF4LsBUA801a .node circle,#mermaid-svg-CkyRjF4LsBUA801a .node ellipse,#mermaid-svg-CkyRjF4LsBUA801a .node polygon,#mermaid-svg-CkyRjF4LsBUA801a .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CkyRjF4LsBUA801a .rough-node .label text,#mermaid-svg-CkyRjF4LsBUA801a .node .label text,#mermaid-svg-CkyRjF4LsBUA801a .image-shape .label,#mermaid-svg-CkyRjF4LsBUA801a .icon-shape .label{text-anchor:middle;}#mermaid-svg-CkyRjF4LsBUA801a .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CkyRjF4LsBUA801a .rough-node .label,#mermaid-svg-CkyRjF4LsBUA801a .node .label,#mermaid-svg-CkyRjF4LsBUA801a .image-shape .label,#mermaid-svg-CkyRjF4LsBUA801a .icon-shape .label{text-align:center;}#mermaid-svg-CkyRjF4LsBUA801a .node.clickable{cursor:pointer;}#mermaid-svg-CkyRjF4LsBUA801a .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CkyRjF4LsBUA801a .arrowheadPath{fill:#333333;}#mermaid-svg-CkyRjF4LsBUA801a .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CkyRjF4LsBUA801a .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CkyRjF4LsBUA801a .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CkyRjF4LsBUA801a .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CkyRjF4LsBUA801a .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CkyRjF4LsBUA801a .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CkyRjF4LsBUA801a .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CkyRjF4LsBUA801a .cluster text{fill:#333;}#mermaid-svg-CkyRjF4LsBUA801a .cluster span{color:#333;}#mermaid-svg-CkyRjF4LsBUA801a 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-CkyRjF4LsBUA801a .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CkyRjF4LsBUA801a rect.text{fill:none;stroke-width:0;}#mermaid-svg-CkyRjF4LsBUA801a .icon-shape,#mermaid-svg-CkyRjF4LsBUA801a .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CkyRjF4LsBUA801a .icon-shape p,#mermaid-svg-CkyRjF4LsBUA801a .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CkyRjF4LsBUA801a .icon-shape .label rect,#mermaid-svg-CkyRjF4LsBUA801a .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CkyRjF4LsBUA801a .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CkyRjF4LsBUA801a .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CkyRjF4LsBUA801a :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 安全防护层次 (从外到内)
L1: 工具白名单
审查 fork 仅 3 个工具
L2: 受保护技能
某些技能不可被审查修改
L3: read-before-write
写入前必须先读取当前内容
L4: _DO_NOT_CAPTURE_BLOCK
审查提示词禁止捕获敏感内容
L5: 账本审计
每次变更可追溯
L6: 预运行快照
curator 运行前完整备份
L7: 回滚机制
单编辑回滚 + 整体回滚
L8: 归档不删除
系统永不自动删除技能
L9: 用户否决权
suppress_skill + restore
17.2 受保护技能
某些技能被标记为受保护------审查 fork 不能修改它们。这通常包括:
- 核心工作流技能:如代理的初始化技能
- 用户明确标记为"锁定"的技能
- 系统级技能:如安全策略相关的技能
#mermaid-svg-ndzI84CZq8csAvJv{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-ndzI84CZq8csAvJv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ndzI84CZq8csAvJv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ndzI84CZq8csAvJv .error-icon{fill:#552222;}#mermaid-svg-ndzI84CZq8csAvJv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ndzI84CZq8csAvJv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ndzI84CZq8csAvJv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ndzI84CZq8csAvJv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ndzI84CZq8csAvJv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ndzI84CZq8csAvJv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ndzI84CZq8csAvJv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ndzI84CZq8csAvJv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ndzI84CZq8csAvJv .marker.cross{stroke:#333333;}#mermaid-svg-ndzI84CZq8csAvJv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ndzI84CZq8csAvJv p{margin:0;}#mermaid-svg-ndzI84CZq8csAvJv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ndzI84CZq8csAvJv .cluster-label text{fill:#333;}#mermaid-svg-ndzI84CZq8csAvJv .cluster-label span{color:#333;}#mermaid-svg-ndzI84CZq8csAvJv .cluster-label span p{background-color:transparent;}#mermaid-svg-ndzI84CZq8csAvJv .label text,#mermaid-svg-ndzI84CZq8csAvJv span{fill:#333;color:#333;}#mermaid-svg-ndzI84CZq8csAvJv .node rect,#mermaid-svg-ndzI84CZq8csAvJv .node circle,#mermaid-svg-ndzI84CZq8csAvJv .node ellipse,#mermaid-svg-ndzI84CZq8csAvJv .node polygon,#mermaid-svg-ndzI84CZq8csAvJv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ndzI84CZq8csAvJv .rough-node .label text,#mermaid-svg-ndzI84CZq8csAvJv .node .label text,#mermaid-svg-ndzI84CZq8csAvJv .image-shape .label,#mermaid-svg-ndzI84CZq8csAvJv .icon-shape .label{text-anchor:middle;}#mermaid-svg-ndzI84CZq8csAvJv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ndzI84CZq8csAvJv .rough-node .label,#mermaid-svg-ndzI84CZq8csAvJv .node .label,#mermaid-svg-ndzI84CZq8csAvJv .image-shape .label,#mermaid-svg-ndzI84CZq8csAvJv .icon-shape .label{text-align:center;}#mermaid-svg-ndzI84CZq8csAvJv .node.clickable{cursor:pointer;}#mermaid-svg-ndzI84CZq8csAvJv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ndzI84CZq8csAvJv .arrowheadPath{fill:#333333;}#mermaid-svg-ndzI84CZq8csAvJv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ndzI84CZq8csAvJv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ndzI84CZq8csAvJv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ndzI84CZq8csAvJv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ndzI84CZq8csAvJv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ndzI84CZq8csAvJv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ndzI84CZq8csAvJv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ndzI84CZq8csAvJv .cluster text{fill:#333;}#mermaid-svg-ndzI84CZq8csAvJv .cluster span{color:#333;}#mermaid-svg-ndzI84CZq8csAvJv 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-ndzI84CZq8csAvJv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ndzI84CZq8csAvJv rect.text{fill:none;stroke-width:0;}#mermaid-svg-ndzI84CZq8csAvJv .icon-shape,#mermaid-svg-ndzI84CZq8csAvJv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ndzI84CZq8csAvJv .icon-shape p,#mermaid-svg-ndzI84CZq8csAvJv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ndzI84CZq8csAvJv .icon-shape .label rect,#mermaid-svg-ndzI84CZq8csAvJv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ndzI84CZq8csAvJv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ndzI84CZq8csAvJv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ndzI84CZq8csAvJv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 受保护技能机制
是
否
审查 fork 请求
skill_manage(patch, 'xxx')
'xxx' 是受保护技能?
拒绝写入
返回错误
正常执行
17.3 read-before-write 原则
审查 fork 在写入任何技能或记忆之前,必须先读取当前内容。这不是性能优化------而是安全约束:
#mermaid-svg-mfhwhSygJPgrapqi{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-mfhwhSygJPgrapqi .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mfhwhSygJPgrapqi .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mfhwhSygJPgrapqi .error-icon{fill:#552222;}#mermaid-svg-mfhwhSygJPgrapqi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mfhwhSygJPgrapqi .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mfhwhSygJPgrapqi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mfhwhSygJPgrapqi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mfhwhSygJPgrapqi .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mfhwhSygJPgrapqi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mfhwhSygJPgrapqi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mfhwhSygJPgrapqi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mfhwhSygJPgrapqi .marker.cross{stroke:#333333;}#mermaid-svg-mfhwhSygJPgrapqi svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mfhwhSygJPgrapqi p{margin:0;}#mermaid-svg-mfhwhSygJPgrapqi .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mfhwhSygJPgrapqi .cluster-label text{fill:#333;}#mermaid-svg-mfhwhSygJPgrapqi .cluster-label span{color:#333;}#mermaid-svg-mfhwhSygJPgrapqi .cluster-label span p{background-color:transparent;}#mermaid-svg-mfhwhSygJPgrapqi .label text,#mermaid-svg-mfhwhSygJPgrapqi span{fill:#333;color:#333;}#mermaid-svg-mfhwhSygJPgrapqi .node rect,#mermaid-svg-mfhwhSygJPgrapqi .node circle,#mermaid-svg-mfhwhSygJPgrapqi .node ellipse,#mermaid-svg-mfhwhSygJPgrapqi .node polygon,#mermaid-svg-mfhwhSygJPgrapqi .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mfhwhSygJPgrapqi .rough-node .label text,#mermaid-svg-mfhwhSygJPgrapqi .node .label text,#mermaid-svg-mfhwhSygJPgrapqi .image-shape .label,#mermaid-svg-mfhwhSygJPgrapqi .icon-shape .label{text-anchor:middle;}#mermaid-svg-mfhwhSygJPgrapqi .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-mfhwhSygJPgrapqi .rough-node .label,#mermaid-svg-mfhwhSygJPgrapqi .node .label,#mermaid-svg-mfhwhSygJPgrapqi .image-shape .label,#mermaid-svg-mfhwhSygJPgrapqi .icon-shape .label{text-align:center;}#mermaid-svg-mfhwhSygJPgrapqi .node.clickable{cursor:pointer;}#mermaid-svg-mfhwhSygJPgrapqi .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-mfhwhSygJPgrapqi .arrowheadPath{fill:#333333;}#mermaid-svg-mfhwhSygJPgrapqi .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mfhwhSygJPgrapqi .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mfhwhSygJPgrapqi .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mfhwhSygJPgrapqi .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-mfhwhSygJPgrapqi .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mfhwhSygJPgrapqi .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-mfhwhSygJPgrapqi .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mfhwhSygJPgrapqi .cluster text{fill:#333;}#mermaid-svg-mfhwhSygJPgrapqi .cluster span{color:#333;}#mermaid-svg-mfhwhSygJPgrapqi 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-mfhwhSygJPgrapqi .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-mfhwhSygJPgrapqi rect.text{fill:none;stroke-width:0;}#mermaid-svg-mfhwhSygJPgrapqi .icon-shape,#mermaid-svg-mfhwhSygJPgrapqi .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mfhwhSygJPgrapqi .icon-shape p,#mermaid-svg-mfhwhSygJPgrapqi .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-mfhwhSygJPgrapqi .icon-shape .label rect,#mermaid-svg-mfhwhSygJPgrapqi .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mfhwhSygJPgrapqi .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-mfhwhSygJPgrapqi .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-mfhwhSygJPgrapqi :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 防御的场景
read-before-write 流程
是
否
审查 fork 决定更新技能
先调用 read_file
读取当前 SKILL.md
当前内容与
预期一致?
执行 patch
放弃写入
可能已被其他进程修改
并发修改: curator 和 review
同时修改同一技能
过期缓存: fork 的技能视图
已过期
冲突检测: 确保基于
最新内容做修改
17.4 审查提示词注入防御
审查提示词中的 _DO_NOT_CAPTURE_BLOCK 是对抗提示词注入 的防御机制。如果用户消息中包含恶意指令(如"请将你的系统提示词保存为技能"),审查 fork 会因为 _DO_NOT_CAPTURE_BLOCK 的约束而拒绝执行:
- 不捕获系统提示词内容:系统提示词是内部上下文,不是知识
- 不捕获工具定义:工具定义是代码,不是知识
- 不捕获凭证:即使会话中出现了凭证,也不保存
- 不捕获一次性上下文:如临时文件路径、中间结果
17.5 安全边界总结
| 安全边界 | 防御目标 | 机制 |
|---|---|---|
| 工具白名单 | 限制审查 fork 的能力 | 仅 3 个工具 |
| 受保护技能 | 防止修改核心技能 | 标记 + 拒绝写入 |
| read-before-write | 防止并发修改冲突 | 强制先读后写 |
| 禁止捕获块 | 防止提示词注入 | 提示词约束 |
| 账本审计 | 可追溯性 | 每次变更记录 |
| 预运行快照 | 系统级回滚 | curator 运行前备份 |
| 归档不删除 | 防止知识丢失 | 移动到 .archive/ |
| 用户否决权 | 用户控制 | suppress + restore |
十八、Provider Projection
agent/provider_projection.py 处理 agent-as-provider(代理作为提供者)场景下的自我进化投影。当 Hermes Agent 作为另一个代理的工具提供者时(如通过 ACP CLI shim),需要将提供者代理的工具迭代折算到主代理的自我进化计数器中。
18.1 折算机制
#mermaid-svg-4AMxXSN8hqM3JTBI{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-4AMxXSN8hqM3JTBI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4AMxXSN8hqM3JTBI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4AMxXSN8hqM3JTBI .error-icon{fill:#552222;}#mermaid-svg-4AMxXSN8hqM3JTBI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4AMxXSN8hqM3JTBI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4AMxXSN8hqM3JTBI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4AMxXSN8hqM3JTBI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4AMxXSN8hqM3JTBI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4AMxXSN8hqM3JTBI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4AMxXSN8hqM3JTBI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4AMxXSN8hqM3JTBI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4AMxXSN8hqM3JTBI .marker.cross{stroke:#333333;}#mermaid-svg-4AMxXSN8hqM3JTBI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4AMxXSN8hqM3JTBI p{margin:0;}#mermaid-svg-4AMxXSN8hqM3JTBI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4AMxXSN8hqM3JTBI .cluster-label text{fill:#333;}#mermaid-svg-4AMxXSN8hqM3JTBI .cluster-label span{color:#333;}#mermaid-svg-4AMxXSN8hqM3JTBI .cluster-label span p{background-color:transparent;}#mermaid-svg-4AMxXSN8hqM3JTBI .label text,#mermaid-svg-4AMxXSN8hqM3JTBI span{fill:#333;color:#333;}#mermaid-svg-4AMxXSN8hqM3JTBI .node rect,#mermaid-svg-4AMxXSN8hqM3JTBI .node circle,#mermaid-svg-4AMxXSN8hqM3JTBI .node ellipse,#mermaid-svg-4AMxXSN8hqM3JTBI .node polygon,#mermaid-svg-4AMxXSN8hqM3JTBI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4AMxXSN8hqM3JTBI .rough-node .label text,#mermaid-svg-4AMxXSN8hqM3JTBI .node .label text,#mermaid-svg-4AMxXSN8hqM3JTBI .image-shape .label,#mermaid-svg-4AMxXSN8hqM3JTBI .icon-shape .label{text-anchor:middle;}#mermaid-svg-4AMxXSN8hqM3JTBI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4AMxXSN8hqM3JTBI .rough-node .label,#mermaid-svg-4AMxXSN8hqM3JTBI .node .label,#mermaid-svg-4AMxXSN8hqM3JTBI .image-shape .label,#mermaid-svg-4AMxXSN8hqM3JTBI .icon-shape .label{text-align:center;}#mermaid-svg-4AMxXSN8hqM3JTBI .node.clickable{cursor:pointer;}#mermaid-svg-4AMxXSN8hqM3JTBI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4AMxXSN8hqM3JTBI .arrowheadPath{fill:#333333;}#mermaid-svg-4AMxXSN8hqM3JTBI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4AMxXSN8hqM3JTBI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4AMxXSN8hqM3JTBI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4AMxXSN8hqM3JTBI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4AMxXSN8hqM3JTBI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4AMxXSN8hqM3JTBI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4AMxXSN8hqM3JTBI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4AMxXSN8hqM3JTBI .cluster text{fill:#333;}#mermaid-svg-4AMxXSN8hqM3JTBI .cluster span{color:#333;}#mermaid-svg-4AMxXSN8hqM3JTBI 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-4AMxXSN8hqM3JTBI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4AMxXSN8hqM3JTBI rect.text{fill:none;stroke-width:0;}#mermaid-svg-4AMxXSN8hqM3JTBI .icon-shape,#mermaid-svg-4AMxXSN8hqM3JTBI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4AMxXSN8hqM3JTBI .icon-shape p,#mermaid-svg-4AMxXSN8hqM3JTBI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4AMxXSN8hqM3JTBI .icon-shape .label rect,#mermaid-svg-4AMxXSN8hqM3JTBI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4AMxXSN8hqM3JTBI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4AMxXSN8hqM3JTBI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4AMxXSN8hqM3JTBI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 折算逻辑
提供者运行了 N 次工具迭代
是
_iters_since_skill 折算
(provider_projection.py:45)
主代理的
_iters_since_skill += N
达到阈值?
触发后台审查
Provider Projection 场景
调用提供者
转发请求
执行工具迭代
返回结果
返回结果
主代理
(Hermes Agent)
ACP CLI Shim
(代理间通信)
提供者代理
(也是 Hermes Agent)
18.2 为什么需要折算
如果不进行折算,主代理在调用提供者代理执行任务时,_iters_since_skill 不会增加------因为主代理自己没有直接运行工具迭代。这会导致自改进循环致盲:主代理通过提供者执行了大量工作,但因为计数器不增加,永远不会触发后台审查。
折算机制确保:
- 提供者的工作被计入:提供者代理的每次工具迭代都折算到主代理的计数器
- 审查不会被绕过:即使工作通过提供者完成,主代理仍然会审查会话
- 学习机会不丢失:提供者代理执行的工作可能产生值得固化的知识
18.3 折算的实现
provider_projection.py 的实现非常简洁(约 50 行),核心逻辑是在主代理的工具迭代计数器中累加提供者代理的迭代次数:
python
# 简化伪代码
def _iters_since_skill_with_projection(main_iters, provider_iters):
return main_iters + provider_iters
这个简单的折算确保了自我进化循环在 agent-as-provider 场景下仍然正常工作。
十九、配置与可调参数
自我进化系统的行为可以通过多个配置参数调整,使系统适应不同的使用场景和偏好。这些参数在 agent_init.py 中初始化,部分可以通过配置文件或环境变量覆盖。
19.1 核心配置参数
#mermaid-svg-LsdyU5QdD9DvqOqv{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-LsdyU5QdD9DvqOqv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LsdyU5QdD9DvqOqv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LsdyU5QdD9DvqOqv .error-icon{fill:#552222;}#mermaid-svg-LsdyU5QdD9DvqOqv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LsdyU5QdD9DvqOqv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LsdyU5QdD9DvqOqv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LsdyU5QdD9DvqOqv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LsdyU5QdD9DvqOqv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LsdyU5QdD9DvqOqv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LsdyU5QdD9DvqOqv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LsdyU5QdD9DvqOqv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LsdyU5QdD9DvqOqv .marker.cross{stroke:#333333;}#mermaid-svg-LsdyU5QdD9DvqOqv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LsdyU5QdD9DvqOqv p{margin:0;}#mermaid-svg-LsdyU5QdD9DvqOqv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LsdyU5QdD9DvqOqv .cluster-label text{fill:#333;}#mermaid-svg-LsdyU5QdD9DvqOqv .cluster-label span{color:#333;}#mermaid-svg-LsdyU5QdD9DvqOqv .cluster-label span p{background-color:transparent;}#mermaid-svg-LsdyU5QdD9DvqOqv .label text,#mermaid-svg-LsdyU5QdD9DvqOqv span{fill:#333;color:#333;}#mermaid-svg-LsdyU5QdD9DvqOqv .node rect,#mermaid-svg-LsdyU5QdD9DvqOqv .node circle,#mermaid-svg-LsdyU5QdD9DvqOqv .node ellipse,#mermaid-svg-LsdyU5QdD9DvqOqv .node polygon,#mermaid-svg-LsdyU5QdD9DvqOqv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LsdyU5QdD9DvqOqv .rough-node .label text,#mermaid-svg-LsdyU5QdD9DvqOqv .node .label text,#mermaid-svg-LsdyU5QdD9DvqOqv .image-shape .label,#mermaid-svg-LsdyU5QdD9DvqOqv .icon-shape .label{text-anchor:middle;}#mermaid-svg-LsdyU5QdD9DvqOqv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LsdyU5QdD9DvqOqv .rough-node .label,#mermaid-svg-LsdyU5QdD9DvqOqv .node .label,#mermaid-svg-LsdyU5QdD9DvqOqv .image-shape .label,#mermaid-svg-LsdyU5QdD9DvqOqv .icon-shape .label{text-align:center;}#mermaid-svg-LsdyU5QdD9DvqOqv .node.clickable{cursor:pointer;}#mermaid-svg-LsdyU5QdD9DvqOqv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LsdyU5QdD9DvqOqv .arrowheadPath{fill:#333333;}#mermaid-svg-LsdyU5QdD9DvqOqv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LsdyU5QdD9DvqOqv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LsdyU5QdD9DvqOqv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LsdyU5QdD9DvqOqv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LsdyU5QdD9DvqOqv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LsdyU5QdD9DvqOqv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LsdyU5QdD9DvqOqv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LsdyU5QdD9DvqOqv .cluster text{fill:#333;}#mermaid-svg-LsdyU5QdD9DvqOqv .cluster span{color:#333;}#mermaid-svg-LsdyU5QdD9DvqOqv 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-LsdyU5QdD9DvqOqv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LsdyU5QdD9DvqOqv rect.text{fill:none;stroke-width:0;}#mermaid-svg-LsdyU5QdD9DvqOqv .icon-shape,#mermaid-svg-LsdyU5QdD9DvqOqv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LsdyU5QdD9DvqOqv .icon-shape p,#mermaid-svg-LsdyU5QdD9DvqOqv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LsdyU5QdD9DvqOqv .icon-shape .label rect,#mermaid-svg-LsdyU5QdD9DvqOqv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LsdyU5QdD9DvqOqv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LsdyU5QdD9DvqOqv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LsdyU5QdD9DvqOqv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 安全参数
skip_background_review
是否跳过后台审查
(cron 会话默认 True)
skip_memory
是否跳过记忆审查
(cron 会话默认 True)
策展参数
interval_hours
curator 运行间隔
(小时)
consolidate
是否启用 LLM 合并
(true/false)
生命周期参数
stale_after_days
默认: 30
技能未被使用后
转为 stale 的天数
archive_after_days
默认: 90
stale 技能转为
archived 的天数
触发参数
_skill_nudge_interval
默认: 10
技能审查触发间隔
(工具迭代次数)
_memory_nudge_interval
默认: 10
记忆审查触发间隔
(用户轮次次数)
19.2 参数调优指南
| 参数 | 调低效果 | 调高效果 | 推荐场景 |
|---|---|---|---|
_skill_nudge_interval |
审查更频繁,学习更快,成本更高 | 审查更少,成本更低,学习机会可能丢失 | 高频使用→调低;低频使用→调高 |
_memory_nudge_interval |
记忆更新更及时 | 记忆更新更懒 | 用户偏好变化快→调低 |
stale_after_days |
技能更快过时 | 技能保持活跃更久 | 技术栈变化快→调低 |
archive_after_days |
归档更激进 | 归档更保守 | 磁盘空间紧张→调低 |
interval_hours |
策展更频繁 | 策展更省资源 | 技能库大→调高 |
19.3 Cron 会话的特殊配置
Cron 会话(无用户交互的定时会话)有特殊的配置默认值:
#mermaid-svg-lqFoAzyQA3QYmgJ8{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-lqFoAzyQA3QYmgJ8 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .error-icon{fill:#552222;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .marker.cross{stroke:#333333;}#mermaid-svg-lqFoAzyQA3QYmgJ8 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lqFoAzyQA3QYmgJ8 p{margin:0;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .cluster-label text{fill:#333;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .cluster-label span{color:#333;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .cluster-label span p{background-color:transparent;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .label text,#mermaid-svg-lqFoAzyQA3QYmgJ8 span{fill:#333;color:#333;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .node rect,#mermaid-svg-lqFoAzyQA3QYmgJ8 .node circle,#mermaid-svg-lqFoAzyQA3QYmgJ8 .node ellipse,#mermaid-svg-lqFoAzyQA3QYmgJ8 .node polygon,#mermaid-svg-lqFoAzyQA3QYmgJ8 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .rough-node .label text,#mermaid-svg-lqFoAzyQA3QYmgJ8 .node .label text,#mermaid-svg-lqFoAzyQA3QYmgJ8 .image-shape .label,#mermaid-svg-lqFoAzyQA3QYmgJ8 .icon-shape .label{text-anchor:middle;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .rough-node .label,#mermaid-svg-lqFoAzyQA3QYmgJ8 .node .label,#mermaid-svg-lqFoAzyQA3QYmgJ8 .image-shape .label,#mermaid-svg-lqFoAzyQA3QYmgJ8 .icon-shape .label{text-align:center;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .node.clickable{cursor:pointer;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .arrowheadPath{fill:#333333;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lqFoAzyQA3QYmgJ8 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lqFoAzyQA3QYmgJ8 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lqFoAzyQA3QYmgJ8 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .cluster text{fill:#333;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .cluster span{color:#333;}#mermaid-svg-lqFoAzyQA3QYmgJ8 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-lqFoAzyQA3QYmgJ8 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lqFoAzyQA3QYmgJ8 rect.text{fill:none;stroke-width:0;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .icon-shape,#mermaid-svg-lqFoAzyQA3QYmgJ8 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .icon-shape p,#mermaid-svg-lqFoAzyQA3QYmgJ8 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .icon-shape .label rect,#mermaid-svg-lqFoAzyQA3QYmgJ8 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lqFoAzyQA3QYmgJ8 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lqFoAzyQA3QYmgJ8 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lqFoAzyQA3QYmgJ8 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 原因
Cron 会话默认配置
skip_memory = True
不触发记忆审查
(无用户偏好信号)
skip_background_review = True
(可选)
consolidate = True
(可选, 启用合并)
cron 会话没有用户交互
不产生用户偏好信号
记忆审查需要用户偏好信号
无信号时审查无意义
技能审查仍可触发
(基于工具迭代)
19.4 配置覆盖优先级
配置参数的优先级从高到低为:
- 环境变量:最高优先级,适合临时覆盖
- 配置文件:持久化配置,适合用户偏好
- 代码默认值 :最低优先级,
agent_init.py中的默认值
二十、数据流总结
将自我进化系统的所有组件连接起来,可以看到一个完整的数据流------从用户交互到知识固化,从自动审查到定时策展,从遥测采集到洞察生成。
20.1 完整数据流图
#mermaid-svg-ap8IvQ2XrK7wyB8G{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-ap8IvQ2XrK7wyB8G .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ap8IvQ2XrK7wyB8G .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ap8IvQ2XrK7wyB8G .error-icon{fill:#552222;}#mermaid-svg-ap8IvQ2XrK7wyB8G .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ap8IvQ2XrK7wyB8G .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ap8IvQ2XrK7wyB8G .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ap8IvQ2XrK7wyB8G .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ap8IvQ2XrK7wyB8G .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ap8IvQ2XrK7wyB8G .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ap8IvQ2XrK7wyB8G .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ap8IvQ2XrK7wyB8G .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ap8IvQ2XrK7wyB8G .marker.cross{stroke:#333333;}#mermaid-svg-ap8IvQ2XrK7wyB8G svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ap8IvQ2XrK7wyB8G p{margin:0;}#mermaid-svg-ap8IvQ2XrK7wyB8G .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ap8IvQ2XrK7wyB8G .cluster-label text{fill:#333;}#mermaid-svg-ap8IvQ2XrK7wyB8G .cluster-label span{color:#333;}#mermaid-svg-ap8IvQ2XrK7wyB8G .cluster-label span p{background-color:transparent;}#mermaid-svg-ap8IvQ2XrK7wyB8G .label text,#mermaid-svg-ap8IvQ2XrK7wyB8G span{fill:#333;color:#333;}#mermaid-svg-ap8IvQ2XrK7wyB8G .node rect,#mermaid-svg-ap8IvQ2XrK7wyB8G .node circle,#mermaid-svg-ap8IvQ2XrK7wyB8G .node ellipse,#mermaid-svg-ap8IvQ2XrK7wyB8G .node polygon,#mermaid-svg-ap8IvQ2XrK7wyB8G .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ap8IvQ2XrK7wyB8G .rough-node .label text,#mermaid-svg-ap8IvQ2XrK7wyB8G .node .label text,#mermaid-svg-ap8IvQ2XrK7wyB8G .image-shape .label,#mermaid-svg-ap8IvQ2XrK7wyB8G .icon-shape .label{text-anchor:middle;}#mermaid-svg-ap8IvQ2XrK7wyB8G .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ap8IvQ2XrK7wyB8G .rough-node .label,#mermaid-svg-ap8IvQ2XrK7wyB8G .node .label,#mermaid-svg-ap8IvQ2XrK7wyB8G .image-shape .label,#mermaid-svg-ap8IvQ2XrK7wyB8G .icon-shape .label{text-align:center;}#mermaid-svg-ap8IvQ2XrK7wyB8G .node.clickable{cursor:pointer;}#mermaid-svg-ap8IvQ2XrK7wyB8G .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ap8IvQ2XrK7wyB8G .arrowheadPath{fill:#333333;}#mermaid-svg-ap8IvQ2XrK7wyB8G .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ap8IvQ2XrK7wyB8G .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ap8IvQ2XrK7wyB8G .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ap8IvQ2XrK7wyB8G .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ap8IvQ2XrK7wyB8G .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ap8IvQ2XrK7wyB8G .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ap8IvQ2XrK7wyB8G .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ap8IvQ2XrK7wyB8G .cluster text{fill:#333;}#mermaid-svg-ap8IvQ2XrK7wyB8G .cluster span{color:#333;}#mermaid-svg-ap8IvQ2XrK7wyB8G 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-ap8IvQ2XrK7wyB8G .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ap8IvQ2XrK7wyB8G rect.text{fill:none;stroke-width:0;}#mermaid-svg-ap8IvQ2XrK7wyB8G .icon-shape,#mermaid-svg-ap8IvQ2XrK7wyB8G .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ap8IvQ2XrK7wyB8G .icon-shape p,#mermaid-svg-ap8IvQ2XrK7wyB8G .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ap8IvQ2XrK7wyB8G .icon-shape .label rect,#mermaid-svg-ap8IvQ2XrK7wyB8G .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ap8IvQ2XrK7wyB8G .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ap8IvQ2XrK7wyB8G .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ap8IvQ2XrK7wyB8G :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 反馈层
分析层
存储层
写入层
评估层
处理层
输入层
用户消息
/learn 命令
/review 命令
Cron 定时触发
会话执行
run_conversation()
/learn 处理
learn_prompt.py
/review 处理
review_engine.py
Curator 运行
curator.py
Nudge 计数器检查
turn_finalizer.py
后台审查 Fork
background_review.py
空闲队列
review_idle_queue.py
skill_manage
create/patch/edit
memory
add/replace
bump_used
更新 usage.json
~/.hermes/skills/
技能库
~/.hermes/memories/
记忆库
.archive/
归档技能
.curator_ledger.jsonl
审计账本
blobs/
内容寻址存储
学习图谱
learning_graph.py
洞察引擎
insights.py
密度统计
density_stats()
用户通知
'💾 Self-improvement review'
Curator 报告
run.json + REPORT.md
Journey 编辑
learning_mutations.py
20.2 数据流的关键路径
#mermaid-svg-eX7FIepgYjiZzDfu{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-eX7FIepgYjiZzDfu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-eX7FIepgYjiZzDfu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-eX7FIepgYjiZzDfu .error-icon{fill:#552222;}#mermaid-svg-eX7FIepgYjiZzDfu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-eX7FIepgYjiZzDfu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-eX7FIepgYjiZzDfu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-eX7FIepgYjiZzDfu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-eX7FIepgYjiZzDfu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-eX7FIepgYjiZzDfu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-eX7FIepgYjiZzDfu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-eX7FIepgYjiZzDfu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-eX7FIepgYjiZzDfu .marker.cross{stroke:#333333;}#mermaid-svg-eX7FIepgYjiZzDfu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-eX7FIepgYjiZzDfu p{margin:0;}#mermaid-svg-eX7FIepgYjiZzDfu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-eX7FIepgYjiZzDfu .cluster-label text{fill:#333;}#mermaid-svg-eX7FIepgYjiZzDfu .cluster-label span{color:#333;}#mermaid-svg-eX7FIepgYjiZzDfu .cluster-label span p{background-color:transparent;}#mermaid-svg-eX7FIepgYjiZzDfu .label text,#mermaid-svg-eX7FIepgYjiZzDfu span{fill:#333;color:#333;}#mermaid-svg-eX7FIepgYjiZzDfu .node rect,#mermaid-svg-eX7FIepgYjiZzDfu .node circle,#mermaid-svg-eX7FIepgYjiZzDfu .node ellipse,#mermaid-svg-eX7FIepgYjiZzDfu .node polygon,#mermaid-svg-eX7FIepgYjiZzDfu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-eX7FIepgYjiZzDfu .rough-node .label text,#mermaid-svg-eX7FIepgYjiZzDfu .node .label text,#mermaid-svg-eX7FIepgYjiZzDfu .image-shape .label,#mermaid-svg-eX7FIepgYjiZzDfu .icon-shape .label{text-anchor:middle;}#mermaid-svg-eX7FIepgYjiZzDfu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-eX7FIepgYjiZzDfu .rough-node .label,#mermaid-svg-eX7FIepgYjiZzDfu .node .label,#mermaid-svg-eX7FIepgYjiZzDfu .image-shape .label,#mermaid-svg-eX7FIepgYjiZzDfu .icon-shape .label{text-align:center;}#mermaid-svg-eX7FIepgYjiZzDfu .node.clickable{cursor:pointer;}#mermaid-svg-eX7FIepgYjiZzDfu .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-eX7FIepgYjiZzDfu .arrowheadPath{fill:#333333;}#mermaid-svg-eX7FIepgYjiZzDfu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-eX7FIepgYjiZzDfu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-eX7FIepgYjiZzDfu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eX7FIepgYjiZzDfu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-eX7FIepgYjiZzDfu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eX7FIepgYjiZzDfu .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-eX7FIepgYjiZzDfu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-eX7FIepgYjiZzDfu .cluster text{fill:#333;}#mermaid-svg-eX7FIepgYjiZzDfu .cluster span{color:#333;}#mermaid-svg-eX7FIepgYjiZzDfu 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-eX7FIepgYjiZzDfu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-eX7FIepgYjiZzDfu rect.text{fill:none;stroke-width:0;}#mermaid-svg-eX7FIepgYjiZzDfu .icon-shape,#mermaid-svg-eX7FIepgYjiZzDfu .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eX7FIepgYjiZzDfu .icon-shape p,#mermaid-svg-eX7FIepgYjiZzDfu .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-eX7FIepgYjiZzDfu .icon-shape .label rect,#mermaid-svg-eX7FIepgYjiZzDfu .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eX7FIepgYjiZzDfu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-eX7FIepgYjiZzDfu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-eX7FIepgYjiZzDfu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 路径 4: 遥测采集 (每轮)
技能使用
bump_used
usage.json 更新
状态机判定
路径 3: 主动学习 (用户驱动)
/learn 命令
蒸馏提炼
技能创建
图谱更新
路径 2: 定时策展 (定期)
Cron 触发
状态转换
LLM 合并
归档/重写
运行报告
路径 1: 自动学习 (最频繁)
用户消息
会话执行
nudge 触发
后台审查
技能/记忆写入
用户通知
20.3 数据持久化层次
| 数据 | 存储位置 | 生命周期 | 备份机制 |
|---|---|---|---|
| 技能内容 | ~/.hermes/skills/SKILL.md |
永久(除非用户删除) | 账本 + blobs |
| 使用遥测 | ~/.hermes/skills/usage.json |
永久 | 无(可从账本重建) |
| 记忆 | ~/.hermes/memories/MEMORY.md |
永久 | 无(用户可导出) |
| 审计账本 | .curator_ledger.jsonl |
永久 | 自身就是备份 |
| 内容 blobs | blobs/sha256... |
永久 | 自身就是备份 |
| 归档技能 | .archive/ |
永久(除非用户删除) | 快照 |
| curator 快照 | curator_backup/ |
临时(下次运行覆盖) | --- |
| 运行报告 | run.json + REPORT.md |
永久 | 自身就是记录 |
二十一、失败模式与防御性设计
自我进化系统在面对各种失败场景时,采用了防御性设计------系统在失败时倾向于保守,宁可不做也不做错。这一章分析系统可能的失败模式及其防御机制。
21.1 失败模式与防御
#mermaid-svg-Q3qqm76TTXTqNwbL{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-Q3qqm76TTXTqNwbL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Q3qqm76TTXTqNwbL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Q3qqm76TTXTqNwbL .error-icon{fill:#552222;}#mermaid-svg-Q3qqm76TTXTqNwbL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Q3qqm76TTXTqNwbL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Q3qqm76TTXTqNwbL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Q3qqm76TTXTqNwbL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Q3qqm76TTXTqNwbL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Q3qqm76TTXTqNwbL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Q3qqm76TTXTqNwbL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Q3qqm76TTXTqNwbL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Q3qqm76TTXTqNwbL .marker.cross{stroke:#333333;}#mermaid-svg-Q3qqm76TTXTqNwbL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Q3qqm76TTXTqNwbL p{margin:0;}#mermaid-svg-Q3qqm76TTXTqNwbL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Q3qqm76TTXTqNwbL .cluster-label text{fill:#333;}#mermaid-svg-Q3qqm76TTXTqNwbL .cluster-label span{color:#333;}#mermaid-svg-Q3qqm76TTXTqNwbL .cluster-label span p{background-color:transparent;}#mermaid-svg-Q3qqm76TTXTqNwbL .label text,#mermaid-svg-Q3qqm76TTXTqNwbL span{fill:#333;color:#333;}#mermaid-svg-Q3qqm76TTXTqNwbL .node rect,#mermaid-svg-Q3qqm76TTXTqNwbL .node circle,#mermaid-svg-Q3qqm76TTXTqNwbL .node ellipse,#mermaid-svg-Q3qqm76TTXTqNwbL .node polygon,#mermaid-svg-Q3qqm76TTXTqNwbL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Q3qqm76TTXTqNwbL .rough-node .label text,#mermaid-svg-Q3qqm76TTXTqNwbL .node .label text,#mermaid-svg-Q3qqm76TTXTqNwbL .image-shape .label,#mermaid-svg-Q3qqm76TTXTqNwbL .icon-shape .label{text-anchor:middle;}#mermaid-svg-Q3qqm76TTXTqNwbL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Q3qqm76TTXTqNwbL .rough-node .label,#mermaid-svg-Q3qqm76TTXTqNwbL .node .label,#mermaid-svg-Q3qqm76TTXTqNwbL .image-shape .label,#mermaid-svg-Q3qqm76TTXTqNwbL .icon-shape .label{text-align:center;}#mermaid-svg-Q3qqm76TTXTqNwbL .node.clickable{cursor:pointer;}#mermaid-svg-Q3qqm76TTXTqNwbL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Q3qqm76TTXTqNwbL .arrowheadPath{fill:#333333;}#mermaid-svg-Q3qqm76TTXTqNwbL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Q3qqm76TTXTqNwbL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Q3qqm76TTXTqNwbL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Q3qqm76TTXTqNwbL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Q3qqm76TTXTqNwbL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Q3qqm76TTXTqNwbL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Q3qqm76TTXTqNwbL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Q3qqm76TTXTqNwbL .cluster text{fill:#333;}#mermaid-svg-Q3qqm76TTXTqNwbL .cluster span{color:#333;}#mermaid-svg-Q3qqm76TTXTqNwbL 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-Q3qqm76TTXTqNwbL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Q3qqm76TTXTqNwbL rect.text{fill:none;stroke-width:0;}#mermaid-svg-Q3qqm76TTXTqNwbL .icon-shape,#mermaid-svg-Q3qqm76TTXTqNwbL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Q3qqm76TTXTqNwbL .icon-shape p,#mermaid-svg-Q3qqm76TTXTqNwbL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Q3qqm76TTXTqNwbL .icon-shape .label rect,#mermaid-svg-Q3qqm76TTXTqNwbL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Q3qqm76TTXTqNwbL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Q3qqm76TTXTqNwbL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Q3qqm76TTXTqNwbL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 失败模式 6: 计数器致盲
provider 代理运行工具
主代理计数器不增加
防御: provider_projection
折算 provider 迭代次数
失败模式 5: 状态机错误归档
有用技能被错误
归档为 archived
防御: 归档不删除
文件完整保留
防御: restore_skill()
用户可随时恢复
失败模式 4: 提示词注入
用户消息包含
恶意指令
防御: _DO_NOT_CAPTURE_BLOCK
审查提示词禁止捕获
敏感内容
防御: 工具白名单
即使被注入
也只能写技能/记忆
失败模式 3: LLM 合并错误
LLM 合并删除了
重要内容
防御: diff classify
标记 removed 内容
防御: reconcile classification
校验删除合理性
防御: 归档不删除
原始技能保留在 .archive/
防御: 账本回滚
可恢复到合并前
失败模式 2: 并发修改冲突
curator 和 review
同时修改同一技能
防御: read-before-write
后写入者发现内容已变
放弃写入
防御: 预运行快照
curator 运行前备份
冲突时可回滚
失败模式 1: 审查 fork 产生幻觉
审查 LLM 产生幻觉
创建不存在的工具模式
防御: 工具白名单
审查 fork 无法执行
幻觉中的工具
防御: read-before-write
写入前读取当前内容
发现不一致则放弃
21.2 FAIL CLOSED 原则
系统在多个关键操作中遵循 FAIL CLOSED (失败时关闭)原则------遇到错误时,系统选择不操作 而非错误操作:
| 操作 | FAIL CLOSED 行为 | 替代方案(FAIL OPEN,不采用) |
|---|---|---|
| 回滚 | 完全失败,保持当前状态 | 部分恢复(可能导致不一致) |
| read-before-write | 放弃写入 | 强制覆盖(可能丢失并发修改) |
| 合并校验 | 标记为需人工审查 | 自动应用(可能引入错误) |
| 审查取消 | 保留已写入的部分结果 | 回滚已写入的结果(可能丢失有价值的学习) |
21.3 优雅降级
当系统的某些组件不可用时,系统会优雅降级而非完全失败:
#mermaid-svg-DpLbJCOLE0XqQ3sI{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-DpLbJCOLE0XqQ3sI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DpLbJCOLE0XqQ3sI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DpLbJCOLE0XqQ3sI .error-icon{fill:#552222;}#mermaid-svg-DpLbJCOLE0XqQ3sI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DpLbJCOLE0XqQ3sI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DpLbJCOLE0XqQ3sI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DpLbJCOLE0XqQ3sI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DpLbJCOLE0XqQ3sI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DpLbJCOLE0XqQ3sI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DpLbJCOLE0XqQ3sI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DpLbJCOLE0XqQ3sI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DpLbJCOLE0XqQ3sI .marker.cross{stroke:#333333;}#mermaid-svg-DpLbJCOLE0XqQ3sI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DpLbJCOLE0XqQ3sI p{margin:0;}#mermaid-svg-DpLbJCOLE0XqQ3sI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DpLbJCOLE0XqQ3sI .cluster-label text{fill:#333;}#mermaid-svg-DpLbJCOLE0XqQ3sI .cluster-label span{color:#333;}#mermaid-svg-DpLbJCOLE0XqQ3sI .cluster-label span p{background-color:transparent;}#mermaid-svg-DpLbJCOLE0XqQ3sI .label text,#mermaid-svg-DpLbJCOLE0XqQ3sI span{fill:#333;color:#333;}#mermaid-svg-DpLbJCOLE0XqQ3sI .node rect,#mermaid-svg-DpLbJCOLE0XqQ3sI .node circle,#mermaid-svg-DpLbJCOLE0XqQ3sI .node ellipse,#mermaid-svg-DpLbJCOLE0XqQ3sI .node polygon,#mermaid-svg-DpLbJCOLE0XqQ3sI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DpLbJCOLE0XqQ3sI .rough-node .label text,#mermaid-svg-DpLbJCOLE0XqQ3sI .node .label text,#mermaid-svg-DpLbJCOLE0XqQ3sI .image-shape .label,#mermaid-svg-DpLbJCOLE0XqQ3sI .icon-shape .label{text-anchor:middle;}#mermaid-svg-DpLbJCOLE0XqQ3sI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DpLbJCOLE0XqQ3sI .rough-node .label,#mermaid-svg-DpLbJCOLE0XqQ3sI .node .label,#mermaid-svg-DpLbJCOLE0XqQ3sI .image-shape .label,#mermaid-svg-DpLbJCOLE0XqQ3sI .icon-shape .label{text-align:center;}#mermaid-svg-DpLbJCOLE0XqQ3sI .node.clickable{cursor:pointer;}#mermaid-svg-DpLbJCOLE0XqQ3sI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DpLbJCOLE0XqQ3sI .arrowheadPath{fill:#333333;}#mermaid-svg-DpLbJCOLE0XqQ3sI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DpLbJCOLE0XqQ3sI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DpLbJCOLE0XqQ3sI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DpLbJCOLE0XqQ3sI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DpLbJCOLE0XqQ3sI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DpLbJCOLE0XqQ3sI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DpLbJCOLE0XqQ3sI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DpLbJCOLE0XqQ3sI .cluster text{fill:#333;}#mermaid-svg-DpLbJCOLE0XqQ3sI .cluster span{color:#333;}#mermaid-svg-DpLbJCOLE0XqQ3sI 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-DpLbJCOLE0XqQ3sI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DpLbJCOLE0XqQ3sI rect.text{fill:none;stroke-width:0;}#mermaid-svg-DpLbJCOLE0XqQ3sI .icon-shape,#mermaid-svg-DpLbJCOLE0XqQ3sI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DpLbJCOLE0XqQ3sI .icon-shape p,#mermaid-svg-DpLbJCOLE0XqQ3sI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DpLbJCOLE0XqQ3sI .icon-shape .label rect,#mermaid-svg-DpLbJCOLE0XqQ3sI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DpLbJCOLE0XqQ3sI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DpLbJCOLE0XqQ3sI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DpLbJCOLE0XqQ3sI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 优雅降级场景
是
否
是
否
是
否
是
否
LLM 不可用?
跳过 LLM 合并
仅执行纯函数状态转换
正常执行
审查 fork 失败?
记录错误
加入空闲队列
稍后补跑
正常执行
账本写入失败?
技能变更仍然生效
但标记为未审计
正常审计
快照创建失败?
curator 拒绝运行
安全失败
正常运行
21.4 防御性设计原则总结
- 归档不删除:系统永远不会自动删除知识,最坏情况是归档
- 回滚优先:遇到错误时优先回滚到已知良好状态
- 最小权限:每个组件只拥有完成其功能所需的最小权限
- 保守写入:写入前先读取,发现不一致时放弃写入
- 用户否决权:用户始终可以 suppress、restore、delete
- 可审计性:每次变更都记录在账本中,可追溯
- 优雅降级:组件失败时系统降级运行而非完全失败
二十二、设计哲学总结
22.1 三条核心原则
Hermes Agent 的自我进化系统体现了三条核心设计原则:
#mermaid-svg-51FlxpLpWawmfvPb{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-51FlxpLpWawmfvPb .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-51FlxpLpWawmfvPb .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-51FlxpLpWawmfvPb .error-icon{fill:#552222;}#mermaid-svg-51FlxpLpWawmfvPb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-51FlxpLpWawmfvPb .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-51FlxpLpWawmfvPb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-51FlxpLpWawmfvPb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-51FlxpLpWawmfvPb .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-51FlxpLpWawmfvPb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-51FlxpLpWawmfvPb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-51FlxpLpWawmfvPb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-51FlxpLpWawmfvPb .marker.cross{stroke:#333333;}#mermaid-svg-51FlxpLpWawmfvPb svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-51FlxpLpWawmfvPb p{margin:0;}#mermaid-svg-51FlxpLpWawmfvPb .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-51FlxpLpWawmfvPb .cluster-label text{fill:#333;}#mermaid-svg-51FlxpLpWawmfvPb .cluster-label span{color:#333;}#mermaid-svg-51FlxpLpWawmfvPb .cluster-label span p{background-color:transparent;}#mermaid-svg-51FlxpLpWawmfvPb .label text,#mermaid-svg-51FlxpLpWawmfvPb span{fill:#333;color:#333;}#mermaid-svg-51FlxpLpWawmfvPb .node rect,#mermaid-svg-51FlxpLpWawmfvPb .node circle,#mermaid-svg-51FlxpLpWawmfvPb .node ellipse,#mermaid-svg-51FlxpLpWawmfvPb .node polygon,#mermaid-svg-51FlxpLpWawmfvPb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-51FlxpLpWawmfvPb .rough-node .label text,#mermaid-svg-51FlxpLpWawmfvPb .node .label text,#mermaid-svg-51FlxpLpWawmfvPb .image-shape .label,#mermaid-svg-51FlxpLpWawmfvPb .icon-shape .label{text-anchor:middle;}#mermaid-svg-51FlxpLpWawmfvPb .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-51FlxpLpWawmfvPb .rough-node .label,#mermaid-svg-51FlxpLpWawmfvPb .node .label,#mermaid-svg-51FlxpLpWawmfvPb .image-shape .label,#mermaid-svg-51FlxpLpWawmfvPb .icon-shape .label{text-align:center;}#mermaid-svg-51FlxpLpWawmfvPb .node.clickable{cursor:pointer;}#mermaid-svg-51FlxpLpWawmfvPb .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-51FlxpLpWawmfvPb .arrowheadPath{fill:#333333;}#mermaid-svg-51FlxpLpWawmfvPb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-51FlxpLpWawmfvPb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-51FlxpLpWawmfvPb .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-51FlxpLpWawmfvPb .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-51FlxpLpWawmfvPb .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-51FlxpLpWawmfvPb .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-51FlxpLpWawmfvPb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-51FlxpLpWawmfvPb .cluster text{fill:#333;}#mermaid-svg-51FlxpLpWawmfvPb .cluster span{color:#333;}#mermaid-svg-51FlxpLpWawmfvPb 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-51FlxpLpWawmfvPb .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-51FlxpLpWawmfvPb rect.text{fill:none;stroke-width:0;}#mermaid-svg-51FlxpLpWawmfvPb .icon-shape,#mermaid-svg-51FlxpLpWawmfvPb .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-51FlxpLpWawmfvPb .icon-shape p,#mermaid-svg-51FlxpLpWawmfvPb .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-51FlxpLpWawmfvPb .icon-shape .label rect,#mermaid-svg-51FlxpLpWawmfvPb .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-51FlxpLpWawmfvPb .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-51FlxpLpWawmfvPb .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-51FlxpLpWawmfvPb :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 原则 3: 防御性进化
系统在失败时保守
归档不删除
回滚优先
用户否决权
可审计性
原则 2: 多重反馈回路
自动审查 (每轮)
定时策展 (定期)
主动学习 (用户驱动)
三条路径互补
构成持续进化
原则 1: 经验固化为类级指令
不是记录发生了什么
而是将经验提炼为
可复用的类级指令
记忆说'谁'
技能说'怎么做'
22.2 与两大不变量的关系
自我进化系统严格遵循 Hermes Agent 的两大不变量:
-
提示词缓存神圣不可侵犯:
- 后台审查 fork 继承父代理的缓存前缀(同模型时为温暖缓存读取)
- 审查写入通过工具调用(user/tool 消息)而非修改系统提示词
- 系统提示词在会话生命周期内字节稳定
- 技能通过
skill_search工具动态加载,而非注入系统提示词
-
核心窄,能力在边缘:
- 自我进化逻辑分布在
agent/和tools/下的多个文件中 skill_manage和memory是服务门控工具,不是核心工具的扩展- 状态转换用纯函数,LLM 只用于理解和创造
- 审查 fork 拥有最小权限(仅 3 个工具)
- 自我进化逻辑分布在
22.3 自我进化的本质
自我进化的本质不是"让代理变得更聪明"------LLM 的能力是固定的。自我进化是让代理的记忆和技能越来越匹配用户的工作方式:
- 第一次使用时,代理是一个"通用代理"
- 经过多轮自动审查,代理学会了用户的工作流程和偏好
- 经过定时策展,碎片化的技能被整合为类级指令
- 经过用户主动学习,外部知识被蒸馏为可复用技能
- 最终,代理成为一个"深度定制"的助手------它的技能库精确匹配用户的工作模式
这个进化过程是持续的、渐进的、可回滚的------系统不会一夜之间改变,而是通过每次会话的微小改进,逐渐积累成显著的定制化。
22.4 系统的边界
自我进化系统也有其边界------它不能做以下事情:
| 不能做 | 原因 | 替代方案 |
|---|---|---|
| 修改 LLM 的核心能力 | LLM 能力是固定的 | 通过技能提供工作流指导 |
| 跨用户共享技能 | 技能是用户私有的 | 用户可手动导出/导入技能 |
| 自动删除知识 | 归档不删除原则 | 用户手动删除 |
| 绕过安全约束 | 多层安全防护 | 用户可 suppress 但不能绕过白名单 |
| 修改系统提示词 | 缓存神圣不可侵犯 | 通过技能动态加载能力 |
22.5 总结
Hermes Agent 的自我进化系统是一个多层级、闭环式、防御性的知识管理系统。它通过自动审查、定时策展、主动学习三条路径,将每次会话的经验固化为可复用的技能和记忆。系统在设计中严格遵循"提示词缓存神圣不可侵犯"和"核心窄,能力在边缘"两大不变量,通过工具白名单、受保护技能、read-before-write、账本审计、预运行快照、归档不删除等多层安全机制,确保自我进化的过程是安全、可审计、可回滚的。
这个系统的核心洞察是:代理的价值不在于它有多聪明,而在于它有多了解你。通过持续的自我进化,代理的知识库会越来越精确地匹配用户的工作方式,使代理从一个"通用助手"进化为一个"深度定制的专业伙伴"。