Files
claude-code/docs/task/task-017-skill-learning-evolution.md
unraid 95fece4b51 feat: 整合功能恢复与技能学习闭环(含 ECC v2.1 parity + Opus 4.7 接入 + prompt 工程优化)
主要变更:
- Skill Learning 闭环系统 (9/9 AC)
- Opus 4.7 模型层接入 + adaptive thinking
- Prompt 工程优化 (64 审计测试)
- Agent Teams 简化门控 (默认启用)
- Windows Terminal 后端修复 (EncodedCommand/WT_SESSION)
- TF-IDF 技能搜索精准化 (字段加权/CJK 优化)
- Autonomy 系统 (/autonomy 命令)
- ACP 协议完整实现
- mock.module 泄漏修复 (CI 全绿)
- 152+ lint/type 修复
2026-04-22 16:07:42 +08:00

289 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Task 017: Skill Learning / Evolution 内置化
> 设计文档: [skill-learning-evolution-design.md](../features/skill-learning-evolution-design.md)
> 需求文档: [skill-learning-ecc-analysis.md](../features/skill-learning-ecc-analysis.md)
> 策略规范: [skill-learning-policy.md](../features/skill-learning-policy.md)
> 依赖: 当前 `EXPERIMENTAL_SKILL_SEARCH` 已实现并默认启用
> 范围: 新增内置 Skill Learning / Evolution 的最小闭环,不改现有 Skill Search 核心算法。
## 目标
把 ECC `continuous-learning-v2` 的 observation -> instinct -> evolve -> learned skill 模型内置到项目中,形成可测试的本地学习闭环。
最终用户效果:
```text
会话 transcript
-> 提取 observation
-> 生成 project-scoped instinct
-> evolve 为 learned SKILL.md
-> clearSkillIndexCache()
-> 现有 Skill Search 可推荐 learned skill
```
## 文件清单
### 新增
| 文件 | 说明 |
|------|------|
| `src/services/skillLearning/types.ts` | Observation / Instinct / Draft 类型。 |
| `src/services/skillLearning/featureCheck.ts` | `SKILL_LEARNING` gate 与环境变量控制。 |
| `src/services/skillLearning/learningPolicy.ts` | 学习阈值、命名、scope、生成规则。 |
| `src/services/skillLearning/projectContext.ts` | 项目识别与 project id 生成。 |
| `src/services/skillLearning/observationStore.ts` | observation 写入、读取、归档、scrub。 |
| `src/services/skillLearning/sessionObserver.ts` | 从 transcript / observations 提取 instinct 候选。 |
| `src/services/skillLearning/instinctStore.ts` | instinct 读写、upsert、status、prune。 |
| `src/services/skillLearning/skillGenerator.ts` | 从 instinct cluster 生成 SKILL.md 草稿。 |
| `src/services/skillLearning/evolution.ts` | instinct 聚类与 skill/command/agent 分类建议。 |
| `src/services/skillLearning/promotion.ts` | project -> global promotion 规则。 |
| `src/services/skillLearning/skillLifecycle.ts` | 新 skill 与旧 skill 的 create/merge/replace/archive/delete 决策。 |
| `src/services/skillLearning/__tests__/*.test.ts` | 对应单元测试。 |
| `src/commands/skill-learning/index.ts` | 命令入口。 |
| `src/commands/skill-learning/skill-learning.ts` | `status/ingest/evolve/export/import/prune` 子命令。 |
### 修改
| 文件 | 变更 |
|------|------|
| `src/commands.ts` | 注册 `skill-learning` 命令或同等入口。 |
| `src/utils/attachments.ts` | 不需要第一版改动;通过 generated SKILL.md 回流到现有索引。 |
| `build.ts` / `scripts/dev.ts` | 可选加入 `SKILL_LEARNING` feature。初版建议 dev 启用build 暂不默认。 |
## 实现步骤
### 1. 类型与 gate
实现:
```text
types.ts
featureCheck.ts
```
验收:
- 类型包含 `SkillObservation``Instinct``LearnedSkillDraft`
- `isSkillLearningEnabled()` 支持:
- `SKILL_LEARNING_ENABLED=0`
- `SKILL_LEARNING_ENABLED=1`
- `feature('SKILL_LEARNING')`
### 2. Project Context
实现:
```text
projectContext.resolveProjectContext(cwd)
```
优先级:
1. `CLAUDE_PROJECT_DIR`
2. `git remote get-url origin`
3. `git rev-parse --show-toplevel`
4. global fallback
验收:
- 同一 git remote 在不同路径下生成相同 project id。
- 无 git 仓库时返回 global context。
- 写入 `projects.json``project.json`
### 3. Observation Store
实现:
```text
appendObservation()
readObservations()
ingestTranscript()
scrubObservation()
archiveLargeObservationFile()
```
验收:
- 能从 Claude JSONL transcript 读取 user/assistant/tool_result。
- secret 字段被 scrub。
- 大字段截断。
- 写入 project-specific `observations.jsonl`
### 4. Session Observer
实现最小规则引擎:
| 规则 | 输出 |
|------|------|
| 用户明确纠正 | instinct: prefer corrected action |
| tool error 后成功 | instinct: error resolution |
| 重复 tool sequence | instinct: workflow |
| 明确项目约定 | instinct: project convention |
验收:
- fixture transcript 中用户说“不要 mock用 testing-library”能生成 testing instinct。
- fixture transcript 中重复 `Grep -> Read -> Edit` 能生成 workflow instinct。
- 没有明显模式时不生成 instinct。
### 5. Instinct Store
实现:
```text
saveInstinct()
loadInstincts()
upsertInstinct()
updateConfidence()
exportInstincts()
importInstincts()
prunePendingInstincts()
```
验收:
- instinct 文件可序列化/反序列化。
- 相同 id 的 confirming observation 增加 confidence。
- contradiction 降低 confidence。
- pending 超过 TTL 可 prune。
### 6. Skill Generator + Lifecycle
实现:
```text
generateSkillDraft(instincts)
writeLearnedSkill(draft)
compareExistingSkills(draft)
decideSkillLifecycle(draft, existingSkills)
applySkillLifecycleDecision(decision)
writeReplacementManifest(manifest)
```
输出路径:
```text
project: <repo>/.claude/skills/<name>/SKILL.md
global: ~/.claude/skills/<name>/SKILL.md
```
`origin: skill-learning` 标记这是 learned skill。不要把 active generated skill 放在 `skills/learned/<name>/SKILL.md`,因为当前 skill loader 只索引一层 `skills/<skill>/SKILL.md`
验收:
- 生成合法 frontmatter: `name` + `description`
- body 包含 Trigger、Action、Evidence。
- 生成前必须检索现有 skill判断 create/merge/replace/archive/delete。
- merge 只生成 patch 建议,不自动覆盖旧 skill。
- replace 必须让旧 skill 从 active index 消失。
- 默认 archive-firsthard delete 需要引用检查和 manifest。
- 写入后调用 `clearSkillIndexCache()`
### 7. Evolution
实现:
```text
clusterInstincts()
classifyEvolutionTarget()
suggestEvolutions()
generateSkillCandidates()
```
第一版只真正生成 skillcommand/agent 只输出建议。
验收:
- 2+ 同 domain/trigger instincts 可聚类。
- 高置信 cluster 生成 skill candidate。
- 低置信 cluster 只报告,不生成。
旧 skill 处理规则:
| 场景 | 行为 |
|------|------|
| 新能力无覆盖 | create 新 learned skill。 |
| 旧 skill 已覆盖主体 | merge输出 patch 建议。 |
| 新 skill 明显更完整且旧 skill 会冲突 | replace激活新 skill旧 skill 移出 active index。 |
| 旧 skill 低质量/过期 | archive移动到 `.archive/`。 |
| 旧 skill 无引用、可安全移除 | delete写 tombstone 后删除。 |
### 8. Commands
提供命令:
```bash
skill-learning status
skill-learning ingest <transcript>
skill-learning evolve [--generate]
skill-learning export [--scope project|global]
skill-learning import <file>
skill-learning prune [--max-age 30]
```
验收:
- 每个子命令有单元测试或集成测试。
- 命令输出不依赖外部网络。
- 写入文件前路径清晰可见。
## 测试计划
### 单元测试
| 测试文件 | 覆盖 |
|----------|------|
| `projectContext.test.ts` | project id / registry |
| `learningPolicy.test.ts` | 命名、生成阈值、scope 决策 |
| `observationStore.test.ts` | transcript ingestion / scrub |
| `sessionObserver.test.ts` | 规则提取 |
| `instinctStore.test.ts` | upsert / confidence / prune |
| `skillGenerator.test.ts` | SKILL.md 生成 |
| `evolution.test.ts` | cluster / classify |
| `skillLifecycle.test.ts` | create/merge/replace/archive/delete 决策replace 后旧 skill 不在 active index |
### 集成测试
```text
fixture transcript
-> ingest
-> observe
-> save instinct
-> evolve --generate
-> compare with existing skills
-> archive/delete superseded skill when replacing
-> getSkillIndex finds generated skill
```
## 验证命令
```bash
bun test src/services/skillLearning
bun test src/commands/skill-learning
bunx tsc --noEmit
bun run lint
```
## 风险
| 风险 | 缓解 |
|------|------|
| 学到错误模式 | 默认 pending生成 skill 需要 confidence/evidence。 |
| 污染全局习惯 | 默认 project scopeglobal 需要 promote。 |
| 泄露代码/secret | observation scrub + 不把 raw code 写进 instinct。 |
| 过度生成 skill | 低置信只保留 instinct不生成 skill。 |
| 与 ECC 冲突 | 使用 `~/.claude/skill-learning/`,不写 `~/.claude/homunculus/`。 |
| 误删旧 skill | 默认 archive-firsthard delete 需要引用检查、manifest 和显式决策。 |
## 完成标准
- [ ] `skill-learning ingest` 能从真实 session JSONL 生成 observations。
- [ ] `skill-learning status` 能显示 project/global instincts。
- [ ] `skill-learning evolve --generate` 能生成 learned `SKILL.md`
- [ ] 生成前能识别现有 skill 并给出 create/merge/replace/archive/delete 决策。
- [ ] replace 后旧 skill 不再被 active Skill Search 搜到。
- [ ] archive/delete 会写 replacement manifest 或 tombstone。
- [ ] 生成的 skill 能被现有 `Skill Search` 搜到。
- [ ] `bunx tsc --noEmit` 通过。
- [ ] 相关测试全部通过。