关于 learning-aggregator
面向维护 Agent 学习记录的团队,汇总 `.learnings/` 中的条目,按模式和复发情况生成排序后的改进候选报告。可选的 `--deep` 模式还会分析 Entire 会话轨迹,并与学习记录合并证据。
主要功能
- 01读取并聚合学习记录
- 02按 Pattern-Key 去重与分组
- 03计算复发次数与任务范围
- 04生成排序后的差距报告
- 05可选分析 Entire 会话轨迹
适用场景
- 01定期检查反复出现的 Agent 问题
- 02在重大任务前查找相关历史模式
- 03为指令改进整理有证据的候选项
- 04从会话轨迹中识别重试与用户纠正
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ pskoett/ pskoett-ai-skills --skill learning-aggregator安装后在 Claude Code 中输入/learning-aggregator确认已加载。
附带文件evals/evals.json
详细介绍
学习汇总器
读取所有会话中累积的 .learnings/ 文件,查找规律,并生成按优先级排序的晋升候选项列表。这是外层循环的 检查 步骤。
没有此技能,.learnings/ 就只是一个只写日志。规律不断累积,却无人归纳。由于没人查看,两周后同样的问题又会出现。
使用时机
- 每周例行 — 按计划或手动审查累积的学习记录
- 执行重要任务前 — 检查该任务领域是否已有已知规律
- 一系列会话结束后 — 汇总一个冲刺或事件中的发现
- 某条记录的
Recurrence-Count达到晋升阈值(>= 3)时 — 结合完整上下文核实候选项
输出内容
一份 差距报告 — 按优先级排列的规律列表,这些规律已达到(或接近)晋升阈值,并附有证据和建议操作。
步骤 1:读取所有学习记录文件
读取 .learnings/ 中的这些文件:
| 文件 | 内容 |
|---|---|
LEARNINGS.md | 更正、知识缺口、最佳实践、反复出现的规律 |
ERRORS.md | 命令失败、API 错误、异常 |
FEATURE_REQUESTS.md | 缺失的功能 |
HEALS.md | 由 self-healing 记录的已验证运行时恢复——包括标记出已具备晋升条件的重复规律的 Handoff 块 |
解析每条记录的元数据:
Pattern-Key— 稳定的去重键Recurrence-Count— 该规律出现的次数First-Seen/Last-Seen— 日期范围Priority— 低 / 中 / 高 / 严重Status— 待处理 / 进行中 / 已解决 / 不予修复 / 已晋升 / 已晋升为技能(记录者使用的术语;晋升就绪状态根据Recurrence-Count计算,不作为状态存储)Area— 前端 / 后端 / 基础设施 / 测试 / 文档 / 配置Related Files— 受影响的代码库部分Source— 对话 / 错误 / 用户反馈 / simplify-and-hardenTags— 自由格式标签Task-ID、Session-ID、Occurrence-ID、Source-Ref、Copied-From— 较新记录者使用的可选来源字段
第 2 步:分组与汇总
先构建规范化的发生记录,再进行分组:
- 即使相同条目出现在多个仓库位置,也要合并具有相同条目 ID 和规范化内容的副本。
- 合并在
.learnings/、云端/本地镜像、分叉仓库、转发的转录记录和追踪来源中匹配的Occurrence-ID值。 - 若缺少
Occurrence-ID,则使用明确的Task-ID、Session-ID、Source-Ref和Copied-From血缘信息以及规范化证据来识别副本。不要仅凭不同的文件路径或检查点 ID 推断它们相互独立。 - 将描述同一任务发生记录的一条
.learnings条目和一个追踪事件视为同一次发生,同时保留两者的来源引用作为佐证。 - 对于缺少稳定任务/会话溯源信息的旧条目,将血缘标记为
unknown。这些条目可以按每个规范化条目一次的频率计入其声明的复发次数,但所有血缘未知的证据合计最多只能算作一项独立任务,且不能单独证明跨任务阈值已达成。
然后按 Pattern-Key 对规范化发生记录分组。对于每个组:
- 统计去重后的复发次数,以规范化发生记录为准。不要累加同一条目的重复副本的
Recurrence-Count。 - 统计不同任务数,依据稳定的任务/会话血缘,而非源文件数量。
- 计算时间窗口——
First-Seen与Last-Seen之间的天数。 - 收集所有相关文件——合并所有条目的文件引用。
- 取组内最高优先级。
- 收集证据——每个条目的
Summary和Details。
对于没有 Pattern-Key 的条目,仅使用保守的分组方式:
- 完全匹配:
Area相同,且至少有 2 个相同的Tags。 - 文件重叠:
Related Files路径相同(路径必须完全匹配,不能使用子字符串匹配)。 - 不要基于
Summary文本进行模糊匹配——错误分组的危害大于不分组。
将未分组的条目单独标出,并建议为其指定 Pattern-Key。未分组条目很常见,也在预期之内——它们可能是一次性问题,也可能是真正新颖的问题。
第 3 步:排序与分类
晋升阈值
当满足以下条件时,条目已具备晋升条件:
- 该组的
Recurrence-Count >= 3。 - 有稳定溯源信息证明其出现在
>= 2项不同任务中。 - 时间窗口不超过
30天。
状态属于晋升状态的一部分,而不仅仅是显示元数据:
promoted、promoted_to_skill、resolved和wont_fix对已记录的发生记录而言是终态。保留这些状态作为历史记录,但不要将仅包含终态记录的组列为具备晋升条件。- 如果在最近一次终态事件之后出现更新的
pending或in_progress发生记录,则将其归类为回归/重新出现的模式,并根据终态之后的发生记录计算是否具备晋升条件。 Handoff区块只能证明此前已达到阈值,不能作为再次晋升已处于终态的模式的许可。
接近阈值
满足以下任一条件时,条目即为接近阈值:
Recurrence-Count >= 2;或Priority: high/critical,且至少复发一次。
分类
对于每个晋升候选项,对问题差距类型进行分类:
| 差距类型 | 表现 | 修复目标 |
|---|---|---|
| 知识差距 | Agent 不知道 X | 更新项目指令文件(CLAUDE.md、AGENTS.md、.github/copilot-instructions.md) |
| 工具差距 | Agent 因缺少相应能力而采用临时变通方案 | 添加或更新 MCP 工具/脚本 |
| 技能差距 | 同一行为模式反复失败 | 创建或更新技能(使用 /skill-creator,通过 quick_validate.py 验证,并注册 skill-check 评估) |
| 歧义 | 对规范/提示词存在相互冲突的解释 | 明确指令或添加示例 |
| 推理失败 | Agent 掌握相关知识,但推理错误 | 添加明确的决策规则或约束 |
第 4 步:生成差距报告
输出结构化报告:
## Learning Aggregator: Gap Report
**Scan date:** YYYY-MM-DD
**Period:** [since date] to [now]
**Entries scanned:** N
**Patterns found:** N
**Promotion-ready:** N
**Approaching threshold:** N
### Promotion-Ready Patterns
#### 1. [Pattern-Key] — [Summary]
- **Recurrence:** N times across M tasks
- **Window:** First-Seen → Last-Seen
- **Priority:** high
- **Gap type:** knowledge gap
- **Area:** backend
- **Related files:** path/to/file.ext
- **Evidence:**
- [LRN-YYYYMMDD-001] Summary of first occurrence
- [LRN-YYYYMMDD-002] Summary of second occurrence
- [ERR-YYYYMMDD-001] Summary of related error
- **Recommended action:** Add rule to project instruction files (CLAUDE.md, AGENTS.md, .github/copilot-instructions.md): "[concise prevention rule]"
- **Eval candidate:** Yes — [description of what to test]
#### 2. ...
### Approaching Threshold
#### 1. [Pattern-Key] — [Summary]
- **Recurrence:** 2 times across 1 task
- **Needs:** 1 more recurrence or 1 more distinct task
- ...
### Ungrouped Entries (no Pattern-Key)
- [LRN-YYYYMMDD-005] "Summary" — needs pattern_key assignment
- ...
### Dismissed / Stale
- Entries with Last-Seen > 90 days ago and Status: pending → recommend dismissal
- Terminal-only patterns → report as historical, not promotion-ready
- Legacy groups without enough stable task provenance → report as unverified cross-task recurrence
步骤 5:交接
差距报告将交由:
- self-improvement 技能 — 主 Agent 遵循其晋级工作流,重新验证候选项、展示拟议差异,并将经人工批准的规则应用到项目指令文件中。传递 Pattern-Key、证据、复现次数、差距类型、建议操作、相关文件和跟踪器。无需专用的 Agent 预设。
- eval-creator 技能 — 接收评估候选项并创建永久测试用例
- 人工审查 — 适用于归类为“推理失败”或“歧义”的模式(这些情况需要人工判断)
筛选
--since YYYY-MM-DD— 仅扫描此日期之后的条目--min-recurrence N— 提高晋级阈值--area AREA— 筛选特定领域(frontend、backend 等)--deep— 同时通过 Entire 分析会话轨迹(见下文“会话轨迹分析”)
会话轨迹分析
外层循环从两个互补的数据源读取信息:
| 数据源 | 内容 | 频率 | 成本 |
|---|---|---|---|
.learnings/ | 会话期间由 self-improvement 明确写入的条目。Agent 自身的反思:纠正、知识缺口、它注意到的重复模式。 | 每个会话(热路径) | 接近零 |
| 会话轨迹 | 由 Entire 捕获的完整会话记录:提示词、工具调用、输出、修改的文件、令牌用量、检查点。 | 每周或按需(冷路径) | 较高 — 仅按计划频率运行 |
默认模式读取 .learnings/,并根据 Agent 明确记录的内容生成差距报告。--deep 模式还会分析会话轨迹,并合并两个数据源的发现。
为什么两个数据源都很重要
.learnings/ 记录的是 Agent 注意到并选择记录的内容 — 经过筛选的子集。会话轨迹则捕获发生的一切,包括 Agent 绕过、重试或从未意识到是失败的模式。
在轨迹中可见、但在 .learnings/ 中缺失的模式示例:
- 重试循环:同一工具调用以细微变化重复 3 次以上。Agent 最终成功了,但从未记录最初的失败。
- 用户未明说的纠正:用户在流程中途说“不了,这不对”。Agent 调整了方向,却没有记录这次误解。
- 绕过测试失败:测试失败后,Agent 改变了方法,新方法通过了测试,最初的失败也被遗忘了。
- 上下文交接原因:哪些漂移信号实际触发了交接,而不只是记录发生过交接。
- 令牌/时间异常:成本相对于输出明显偏高的会话 — 这是 Agent 未察觉的低效信号。
这些模式对外层循环很有价值,因为 Agent 无法自行报告它们。会话轨迹是唯一的数据来源。
何时触发 --deep 模式
轨迹分析不是按会话进行的,而是按计划频率进行:
- 每周定期运行(建议的最低频率):在一个冲刺或一系列密集会话之后
- 事件发生后:出现问题且你想了解原因时
- 晋级前:在将某个模式提交到项目指令文件之前,确认它确实会在实际会话中重复出现
- 手动调用:
/learning-aggregator --deep --since 7d
每个会话都运行轨迹分析会消耗令牌,却不会产生新的信号 — 跨会话模式只有在多个会话中才会显现。
使用 Entire 读取轨迹
请求 --deep 时,该技能会使用 entire CLI 查询影子分支数据:
# Check availability
entire --version
# List recent checkpoints as JSON (id, date, session_id, message, tool_use_id)
entire rewind --list
# Read a checkpoint's full transcript
entire explain --checkpoint <id> --full --no-pager
# Or raw JSONL
entire explain --checkpoint <id> --raw-transcript --no-pager
# Filter to one session
entire explain --session <session-id-prefix>
# Generate AI summary (expensive, use sparingly)
entire explain --checkpoint <id> --generate
如果未安装 entire、当前仓库未启用 Entire,或者
entire rewind --list 成功运行但返回零个检查点,--deep 将回退到仅使用
.learnings/ 的模式,并在差距报告中说明具体限制。检查点列表为空
并不能证明没有发生过会话。
从追踪记录中提取的内容
对于时间窗口内的每个检查点,解析原始转录记录并查找:
- 工具调用重复 — 同一工具搭配相似参数出现 > 3 次 → 可能陷入重试循环。模式键:
retry-loop.<tool> - 用户纠正标记 — 用户消息中包含“no”“wrong”“actually”“instead”,且紧接在 Agent 操作之后 → 模式键:
correction.<area> - 工具输出中的错误模式 — error、failed、Traceback 等是候选信号,不代表失败的确凿证据;需结合记录的工具状态进行佐证 → 模式键:
error.<category> - 交接触发条件 — context-surfing 退出事件,以及触发了哪些偏移信号 → 模式键:
drift.<signal> - 方法变更 — Agent 在任务中途切换策略,却没有明确说明转变 → 模式键:
approach-switch.<domain> - Token 异常 — Token 数量 > 相似任务类型中位数 2 倍的会话 → 模式键:
cost.<task-type>
在可能的情况下,将每条发现归一化为与自我改进相同的分类体系(如 harden.input_validation、simplify.dead_code 等)。保留追踪记录来源、检查点、会话和任务沿袭信息,以便与 .learnings/ 中的证据进行去重。
两种来源如何合并到差距报告中
运行 --deep 时,差距报告中的每个模式都会包含一个 sources 字段:
promotion_ready:
- pattern_key: "harden.input_validation"
recurrence_count: 5
sources:
- .learnings/LEARNINGS.md (3 entries)
- entire:traces (5 occurrences across 4 sessions)
confidence: high # appears in both sources
evidence:
- "LRN-20260401-001: Missing bounds check on pagination"
- "entire:1ca16f9b: Retry loop on /api/search — pageSize rejected 4 times"
- "entire:8bf2e4cd: User correction 'validate before DB query'"
entire_checkpoints:
- 1ca16f9bb3801ee2a02f2384f31355a54b81ea00
- 8bf2e4cd63d01040b38df07c43f73e0f15d05ac9
同时出现在两种来源中的模式,比只出现在其中一种来源中的模式可信度更高。只出现在 .learnings/ 中的模式可能是勤勉的 Agent 过度记录所致。只出现在追踪记录中的模式则可能是噪声。重叠部分的信号最强。
追踪记录来源兼容性
默认实现通过 entire rewind --list 和 entire explain 命令支持 Entire(v0.5.4+)。这一概念不依赖具体来源 — 只要环境提供以下内容,也可以使用有文档说明的 Claude、Copilot、Codex 或其他会话来源:
- 最近检查点的列表(含 id、时间戳、会话 id)
- 读取检查点转录记录的能力
- 用于按频率筛选的时间戳
……均可作为追踪记录来源。可以在 scripts/ 中添加其他采集工具的适配器,也可以通过 gh-aw mcp-scripts 添加。
如果没有可用的有文档说明的来源,请勿抓取任意私有转录记录位置,也勿自行臆造适配器。任何适配器都必须输出与 Step 2 相同的稳定任务/会话/来源沿袭信息和出现情况指纹。对于不受支持或为空的来源,应明确报告,而不是将其视为独立证据。
持久化
从工作目录读取 .learnings/。这是唯一的持久化模式 — 此技能在交互式会话中不会集成外部记忆后端。如需在 CI 侧跨工作流运行持久存储,请参阅 learning-aggregator-ci,它可以选择使用 gh-aw 的 repo-memory(Git 分支持久化)作为状态存储。生成的分支是普通 Git 分支,可按需在本地获取,但交互式技能本身只读取本地文件。
差距报告中的跟踪器 ID
差距报告中的每个晋升候选项都包含一个 tracker 字段,其值设为模式键。self-improvement 晋升工作流会在交接信息中保留该字段,并可选择将其作为注释写入项目说明文件;eval-creator 会在评估用例中引用该字段。如需审计已启用的内联来源信息,可在代码库和 GitHub 中搜索 tracker:[pattern-key]。
此技能不会做什么
- 不会修改
.learnings/文件(只读分析) - 不会执行晋升(这由需人工审核的 self-improvement 工作流负责)
- 不会创建评估(这由 eval-creator 负责)
- 不会修复代码或运行测试
- 不会替代人工判断来处理含义模糊的模式
- 不会逐会话运行
--deep追踪分析 — 只会按频率运行或在明确调用时运行 - 不要求使用 Entire — 追踪记录来源不可用时,会回退到仅使用
.learnings/的模式