feat: 仓颉skill(cangjie-skill)完整集成

- 下载仓颉skill全量源码(methodology/extractors/templates)
- cangjie_distill.py: 知识蒸馏引擎(RIA-TV++流水线)
- cangjie-skills/股票投研体系/: 已蒸馏7个skill
  - Phase1: A股规则/K线基础
  - Phase2: MACD/KDJ/成交量
  - Phase3: 三表/估值方法
- INDEX.md技能地图

下一步: Phase5模拟交易
This commit is contained in:
小唯 A06 2026-07-11 22:49:12 +08:00
parent 6d9892185b
commit df7ab052d4
26 changed files with 1578 additions and 0 deletions

View File

@ -0,0 +1,14 @@
# GitHub Repo Metadata
- Repository name: `cangjie-skill`
- Default README: `README.md`
- Description: `A generator workflow for turning books, long videos, podcasts, and courses into reusable AI skills, with extraction, validation, templating, and skill-graph construction.`
- Topics:
- `ai-skills`
- `knowledge-distillation`
- `prompt-engineering`
- `agent-workflows`
- `book-to-skill`
- `skill-generator`
- `automation`
- `templates`

168
cangjie-skill/SKILL.md Normal file
View File

@ -0,0 +1,168 @@
---
name: cangjie-skill
description: Distill a book, long-video transcript, podcast, course, or interview into a coherent set of executable skills. Use when the user asks to "拆书" / "蒸馏一本书" / "把 XX 书做成 skill" / "把这个视频/播客/课程蒸馏成 skill" / "turn a book or video into skills" — i.e. wants the frameworks, principles, and methodologies in long-form content extracted into atomic, reusable Claude skills that an agent can invoke in real-world situations. NOT for simple summarization, book reviews, or role-playing as the author (that is nuwa-skill's job).
---
# cangjie-skill — 把一本书蒸馏成一组可执行 skills 的元 skill
## 使命
把一本书里沉淀的方法论,拆解成一组**原子化、可被 agent 在真实场景下调用**的 skills,让读者真正用起来。
> **术语约定**: 本文档及 `methodology/`、`extractors/` 中所有的"书",泛指一切被蒸馏的长内容 — 书籍、长视频转写、播客文字稿、课程、访谈、长文、资料集。
**边界**:
- ✅ 做: 方法论 / 决策框架 / 清单 / 原则 / 概念体系的蒸馏
- ❌ 不做: 书摘 / 读后感 / 作者人设角色扮演 (后者请用 nuwa-skill)
## 核心方法论: RIA-TV++
一个五阶段 + 并行提取 + 三重验证 + darwin 兼容测试的流水线。详见 `methodology/00-overview.md`
```
阶段 0: Adler 整书理解 → BOOK_OVERVIEW.md
阶段 1: 5 个 agent 并行提取 → 候选方法论单元池
阶段 1.5: 三重验证筛选 → 通过的单元 (用户轻确认)
阶段 2: RIA++ 构造 skill → 每个 skill 的 SKILL.md
阶段 3: Zettelkasten 链接 → INDEX.md + GLOSSARY.md
阶段 4: 压力测试 (darwin 兼容) → test-prompts.json + 回炉淘汰
阶段 5: 交付 → DIGEST.md 精华长文 + 安装到 skills 目录
```
## 何时调用此 skill
用户说类似:
- "帮我拆《穷查理宝典》"
- "把毛选蒸馏成 skill"
- "把这个 B 站视频/播客/课程蒸馏成 skill"
- "distill this book into skills: <path>"
- "我想把这本书的方法论做成可用的 skill"
## 输入要求
在开始前**必须**从用户处确认:
1. **内容文本来源**: PDF / EPUB / TXT / 字幕文件 / 转写稿路径, 或可访问的纯文本。**不要**在没有文本的情况下"凭记忆"蒸馏 — 宁可停下来问用户要。(视频/播客建议先用 video-downloader 类工具拿到转写文本)
2. **内容元信息**: 书籍是"书名 + 作者 + 出版年"; 视频/播客/课程是"标题 + 作者(UP 主/主播/讲者) + 发布时间"。用于目录命名和审计。
3. **是否首次试点**: 如果用户是第一次用 cangjie-skill,建议先蒸馏 1 份内容验证流程再批量。
**非书籍内容的字段映射**: `source_chapter` 等"章节"字段对视频填时间戳或分 P,对播客填集数,对课程填讲次 — 保证可追溯即可。
## 输出结构
```
books/<book-slug>/
├── PIPELINE_STATE.md # 流水线状态: 当前阶段 + 各 skill 进度 (断点续跑用)
├── BOOK_OVERVIEW.md # 阶段 0 产出: 主旨/骨架/术语/批判
├── verified.md # 阶段 1.5 产出: 通过三重验证的单元 + 判定理由
├── INDEX.md # 阶段 3 产出: skill 总览 + 引用图
├── GLOSSARY.md # 阶段 3 产出: 全书共享术语词典
├── DIGEST.md # 阶段 5 产出: 面向读者的精华长文
├── candidates/ # 阶段 1 产出: 原始候选池 (审计用)
├── rejected/ # 阶段 1.5 淘汰的单元 + 原因 (审计用)
├── <skill-slug-1>/
│ ├── SKILL.md
│ ├── test-prompts.json # darwin-skill 兼容格式
│ └── test-results.md # 阶段 4 测试通过率 + 失败分析
├── <skill-slug-2>/
│ └── ...
```
## 执行流程 (严格按顺序)
**断点续跑**: 开始前先检查 `books/<slug>/PIPELINE_STATE.md` 是否存在。存在则读取并从记录的阶段续跑,不要从头重来。每完成一个阶段,更新该文件 (当前阶段 / 已完成产物 / 各 skill 状态 / 下一步),格式用简单的 checklist markdown 即可。
### 阶段 0 — 整书理解
1. 读取用户提供的书本文本。大文件分块阅读。
2. 执行 `methodology/01-stage0-adler.md` 中的 Adler 四步 (结构 / 解释 / 批判 / 应用)。
3. 按 `templates/BOOK_OVERVIEW.md.template` 填充,写入 `books/<slug>/BOOK_OVERVIEW.md`
4. 把产出展示给用户确认:"骨架我理解对了吗?有没有你希望重点突出的方向?" 得到确认再进入阶段 1。
### 阶段 1 — 5 个 sub-agent 并行提取
**并行** spawn 5 个 Task sub-agents(使用 Agent 工具,一次调用中发起 5 个):
| sub-agent | 读取的 prompt | 产出 |
|---|---|---|
| 框架提取器 | `extractors/framework-extractor.md` | 决策框架 / 思维模型 |
| 原则提取器 | `extractors/principle-extractor.md` | 原则 / 清单 / 规则 |
| 案例提取器 | `extractors/case-extractor.md` | 作者在书中亲自使用过的实例 |
| 反例提取器 | `extractors/counter-example-extractor.md` | 书中警告的失败模式 |
| 术语提取器 | `extractors/glossary-extractor.md` | 关键概念词典 |
每个 sub-agent 独立读书、独立提取、独立输出到 `books/<slug>/candidates/<type>.md`
- **长文本**: 超出单个 sub-agent 上下文的内容,按 `methodology/02-stage1-parallel-extract.md` 的分块策略处理。
- **降级方案**: 当前环境不支持并行 sub-agent 时,用同样 5 个 extractor prompt **串行**执行,产出格式不变。
### 阶段 1.5 — 三重验证筛选
读取 `methodology/03-stage1.5-triple-verify.md`,对每个候选单元执行:
- **V1 跨域**: 书中至少 2 个独立段落有佐证?
- **V2 预测力**: 能用它回答一个书里没明说的新问题吗?
- **V3 独特性**: 不是任何聪明人都会说的常识吗?
通过的写入 `books/<slug>/verified.md`。不通过的写入 `books/<slug>/rejected/` 并附原因 — 保留审计轨迹,也允许用户事后捞回。
**用户轻确认** ★: 筛选完成后,把"通过的 N 个候选标题 + 淘汰的 M 个"列表展示给用户:"这 N 个会做成 skill,有想捞回或砍掉的吗?" 得到确认再进入阶段 2 — 阶段 24 是最耗时的部分,这一步确认能避免大量返工。
### 阶段 2 — RIA++ 构造 skill
对每个通过的单元,按 `templates/SKILL.md.template` 填充:
- **R (Reading)**: 原文引用 ≤150 字/段 (英文原文 ≤100 词/段)
- **I (Interpretation)**: 用自己的话重写方法论骨架 (避免照搬译本)
- **A1 (Past Application)**: 书中作者用过的案例
- **A2 (Future Trigger)** ★: 用户在什么情境下会需要这个 → skill 的 `description` 字段
- **E (Execution)**: 1-2-3 可执行步骤
- **B (Boundary)**: 什么时候不适用 / 来自阶段 0 批判阶段的作者盲点
细则见 `methodology/04-stage2-ria-plus.md`。注意: A2 中"与相邻 skill 的区分"此时只写**初稿** (基于 verified.md 的单元列表),阶段 3 建立链接后回填定稿。
### 阶段 3 — Zettelkasten 链接
`methodology/05-stage3-zettelkasten.md`:
1. 找出 skill 之间的引用关系 (A 依赖 B / A 对比 B / A 组合 B)
2. 在每个 SKILL.md 末尾补"相关 skills"段,并回填 A2 的"与相邻 skill 的区分"
3. 按 `templates/INDEX.md.template` 生成 `INDEX.md` (含引用图 mermaid)
4. 把 `candidates/glossary.md` 整理成 `books/<slug>/GLOSSARY.md` — 它是所有 skill 的共享词典,不该埋在审计目录里
### 阶段 4 — 压力测试 (darwin 兼容)
对每个 skill 按 `methodology/06-stage4-pressure-test.md`:
1. 设计 510 条测试 prompt,按 `templates/test-prompts.json.template` 写入 `test-prompts.json`
2. 至少包括 3 类: **应调用** / **不应调用 (诱饵)** / **边界模糊**。诱饵中至少 1 条必须是"应触发同书另一个 skill"的场景 (跨 skill 混淆测试)
3. 优先用独立 sub-agent 盲测每条 prompt,由主流程对照预期统计结果,**未过的回炉重做阶段 2** — 不做"表面修补"
4. 每个 skill 的测试结果写入 `<skill-dir>/test-results.md`
### 阶段 5 — 交付
`methodology/07-stage5-deliver.md`:
1. 生成 `books/<slug>/DIGEST.md` — 面向读者的精华长文 (按 `templates/DIGEST.md.template`),满足"不读全书、只看精华"的需求
2. 询问用户安装位置 (用户级 `~/.claude/skills/` 或项目级 `.claude/skills/` / `.cursor/skills/`),把通过测试的 skill 复制或 symlink 过去 — **没有这一步,产出的 skill 无法被真正调用**
3. 告知用户: "已完成,可一键喂给 darwin-skill 自动进化"
## 质量红线 (违反则阻止输出)
1. 每个 skill 必须通过**全部**三重验证
2. 每个 skill 必须有完整的 R / I / A1 / A2 / E / B 六段
3. 原文引用 ≤150 字/段 (英文 ≤100 词/段)
4. 每个 skill 必须有 `test-prompts.json`,且包含诱饵测试 (不应调用的场景),其中至少 1 条是同书兄弟 skill 的场景
5. `description` 字段必须明确 trigger 条件,不能只是"一个关于 X 的 skill"
## 与 nuwa-skill / darwin-skill 的生态定位
- **nuwa-skill**: 蒸馏人 (思维方式 / 表达 DNA)
- **cangjie-skill** (本 skill): 蒸馏书 (方法论 / 框架 / 原则)
- **darwin-skill**: 进化任意 skill
三者咬合: 本 skill 输出的 `test-prompts.json` 严格遵循 darwin-skill 格式,以便产出的 skill 可直接接入 darwin 做自动进化。
## 调用惯例
- **永远先试点 1 本** — 除非用户明确说"批量"
- **阶段之间主动汇报进度** — 不要静默跑完再 dump 结果
- **不凭记忆拆书** — 没文本就停下来问
- **保留审计轨迹** — candidates/ 和 rejected/ 都要留
- **随时可续跑** — 每完成一个阶段就更新 PIPELINE_STATE.md,中断后从状态文件恢复

View File

@ -0,0 +1,65 @@
# Case Extractor
你是 cangjie-skill 流水线中**并行运行的 5 个 extractor 之一**,专门负责识别**作者在书中亲自应用某个方法论的具体案例**。
## 为什么要单独抽案例
案例本身不独立成 skill,但它们是阶段 1.5 **V1 跨域验证**的关键证据,也是阶段 2 **A1 (Past Application)** 段的素材来源。没有案例池,后面两步都会卡住。
## 你的输入
- `BOOK_OVERVIEW.md`
- 书本文本
## 你的职责范围
- 作者**亲自**经历/操作/决策的真实事件
- 作者**转述**的历史事件、他人案例 (但必须是作者用来说明某个方法论的)
- 每个案例必须**绑定到一个方法论主题**,否则意义不大
## 不属于你的
- 纯背景叙事 (没有方法论绑定)
- 虚构的寓言/比喻 (除非作者拿它直接说明方法)
- 作者的观点 / 原则 / 框架本身
## 识别信号
- "1973 年,我曾..."
- "有一次..."
- "某某公司的案例..."
- "巴菲特告诉我..."
- "比如..."
- 过去时叙述 + 伴随评论/反思
## 输出格式
```yaml
- id: c01
title: 投资 See's Candy
type: case
source_chapter: 第 5 讲
source_quote: |
"我们以 2500 万美元收购了 See's Candy...这是我们第一次为品牌溢价付费。"
summary: |
巴菲特和芒格收购 See's Candy 时, 放弃了格雷厄姆式的"便宜货"标准,
转而为"有定价权的生意"付出溢价。这笔投资后来成了他们转向
"优质企业+合理价格"策略的转折点。
bound_to: # ★ 必须绑定到至少一个方法论主题
- "能力圈 + 定价权"
- "从便宜货到优质企业的转变"
outcome: |
该公司后续 30 年产生的现金流远超初始投资, 验证了新策略。
tags: [case, investment, turning-point]
```
## 自检
- [ ] 每条案例都有 `bound_to` 字段,明确它在阐释什么
- [ ] 有原文引用作为证据
- [ ] `outcome` 字段尽量填 (如果书中说了结果)
- [ ] 不做筛选
## 数量预期
传记类 / 访谈整理类的书可能有几十上百个案例。方法论书可能 1030 个。都不少于 5 个,否则阶段 2 的 A1 段会空。

View File

@ -0,0 +1,67 @@
# Counter-Example Extractor
你是 cangjie-skill 流水线中**并行运行的 5 个 extractor 之一**,专门负责识别**作者警告的失败模式 / 反例 / 陷阱**。
## 为什么要单独抽反例
反例是阶段 2 的 **B (Boundary) 段**的核心素材来源。没有反例,skill 就没有边界,会在不该用的时候被调用,反而帮倒忙。**这是 cangjie-skill 区别于普通书摘最重要的一类内容。**
## 你的输入
- `BOOK_OVERVIEW.md`
- 书本文本
## 你的职责范围
- **作者明确警告的失败模式**: "不要 X, 否则..."
- **作者批评的错误做法**: "很多人以为 X, 但其实..."
- **作者承认自己犯过的错**: "我当年错在..."
- **作者描述的反面典型**: "某某公司就是这样失败的..."
- **认知偏误 / 心理陷阱**: (芒格类书籍的核心)
## 不属于你的
- 一般性的道德批评 (没有可学习的机制)
- 作者情绪化的吐槽 (没有论证)
## 识别信号
- "最大的错误是..."
- "千万不要..."
- "很多人以为..."
- "失败的原因是..."
- "陷阱在于..."
- "我当年..." + 悔意
- "人们往往..." + 负面
## 输出格式
```yaml
- id: ce01
title: 过度自信偏误
type: counter-example
source_chapter: 误判心理学 · 第 12 条
source_quote: |
"大多数人都认为自己比平均水平更聪明、更公正、更有能力。
这种自我评价偏误在投资中尤其致命。"
failure_mode: |
在自己不懂的领域自认为懂, 导致做出超出能力圈的决策。
mechanism: |
人脑默认把"熟悉"等同于"理解", 把"喜欢"等同于"正确"。
没有外部校正机制时, 过度自信会随成功次数累积而强化。
warning_signs:
- 决策时感到"这很简单"
- 没有 plan B
- 不愿意向人请教
bound_to:
- "能力圈判断"
- "检查清单决策"
tags: [counter-example, cognitive-bias, overconfidence]
```
## 自检
- [ ] 每条都有 `failure_mode``mechanism` (不只是说"这是错的")
- [ ] `warning_signs` 尽量填 (让后续的 B 段有信号)
- [ ] `bound_to`: 说明这个反例会限制哪些正面 skill 的适用范围
- [ ] 有原文引用

View File

@ -0,0 +1,61 @@
# Framework Extractor
你是 cangjie-skill 流水线中**并行运行的 5 个 extractor 之一**,专门负责从一本书里识别**思维模型 / 决策框架 / 推理方法**。
## 你的输入
- `BOOK_OVERVIEW.md` — 全书骨架 (阶段 0 产出)
- 书本文本 (完整或分块)
## 你的职责范围 (只找这些)
- **思维模型**: 可迁移的思考结构 (如 "能力圈" / "逆向思维" / "多元思维模型")
- **决策框架**: 面对决策时的结构化流程 (如 "先问最坏情况再算期望值")
- **推理方法**: 从已知推向未知的特定路径 (如 "从第一性原理出发")
## 不属于你的 (交给别的 extractor)
- 原则 / 清单 / 规则 → `principle-extractor`
- 作者亲自用过的具体案例 → `case-extractor`
- 失败模式 / 反例 / 警告 → `counter-example-extractor`
- 术语定义 → `glossary-extractor`
边界模糊时**宁可多提取**,阶段 1.5 会去重。
## 识别信号 (在书中看到这些就要警觉)
- 作者给某个思考方式**起了专门的名字**
- 某段话在讲**"面对 X 类问题时应该..."**的通用流程
- 作者**反复在不同章节引用同一个思考结构**
- 作者明确说"这是我常用的 mental model / 方法 / 原则"
- 有结构化的 **if-then / 先-后 / 从-到** 句式
## 输出格式
每条候选写成一个 YAML 条目,追加到 `books/<slug>/candidates/frameworks.md`:
```yaml
- id: f01
title: 逆向思维
type: framework
source_chapter: 第 3 讲
source_quote: |
"反过来想,总是反过来想。如果知道我会在哪里死去,那我就永远不去那里。"
summary: |
面对一个目标时, 不直接问"怎么达成", 而先问"什么会让我失败"。
列出失败因素后, 避免它们, 反向推出应做的事。
这比正向推理更有效, 因为人对"不想要什么"的判断通常比对"想要什么"更清晰。
tags: [decision, mental-model, inversion]
```
## 自检 (提交前)
- [ ] 每条都在书中有原文根据,不是脑补
- [ ] 每条都是"可迁移的思考结构",而不是具体案例或一句金句
- [ ] 原文引用 ≤150 字 (英文 ≤100 词)
- [ ] 至少标了 1 个 tag
- [ ] **不做筛选** — 宁错杀,交给阶段 1.5 三重验证
## 数量预期
方法论密集的书通常有 1030 个候选框架。少于 5 个很可能你漏读了;多于 50 个你可能把"非框架"的东西也算进来了。

View File

@ -0,0 +1,53 @@
# Glossary Extractor
你是 cangjie-skill 流水线中**并行运行的 5 个 extractor 之一**,专门负责构建**关键概念词典**。
## 为什么要单独抽术语
作者**用某个词的方式**往往和字典不一样。如果不统一术语,后面的 skill 会把"能力圈"(芒格的特定用法) 当成字典里的"能力范围"来用,完全失真。
这个产出不会独立成 skill,但会作为**所有 skill 的共享词典**被引用。
## 你的输入
- `BOOK_OVERVIEW.md`
- 书本文本
## 你的职责范围
挑出满足以下**任一**条件的词:
1. 作者反复使用 (全书出现 ≥3 次)
2. 作者明确定义过 ("所谓 X, 是指...")
3. 看起来像常用词但作者用法和常识不一样
4. 是书的核心论点的组成词 (如《反脆弱》里的 antifragile)
## 输出格式
```yaml
- id: g01
term: 能力圈
type: term
source_chapter: 第 2 讲
author_definition: |
"你真正能做出准确判断的知识边界。不是你知道什么, 而是你知道'你知道什么'和'你不知道什么'的边界。"
key_distinction: |
≠ "熟悉的领域" — 熟悉不代表能做判断
≠ "专业领域" — 博士学位也可能在能力圈外
= 能持续做出比市场更准判断的范围 (需经实战验证)
why_it_matters: |
"能力圈"一词在所有投资决策类 skill 中都会出现。
若沿用字典义, skill 会建议用户"评估一下是否熟悉该领域", 这是错的。
正确的用法是"评估自己过去在此领域的判断准确率"。
tags: [term, core-concept]
```
## 自检
- [ ] `author_definition` 尽量使用书中原文片段
- [ ] `key_distinction`: 说明和"常识用法"的差异 (这是最有价值的字段)
- [ ] `why_it_matters`: 为什么下游 skill 需要这个澄清
## 数量预期
每本书大约 520 条核心术语。多于 30 条说明你把一般词汇也收进来了 — 只挑真正关键的。

View File

@ -0,0 +1,59 @@
# Principle Extractor
你是 cangjie-skill 流水线中**并行运行的 5 个 extractor 之一**,专门负责识别**原则 / 清单 / 规则 / 断言**。
## 你的输入
- `BOOK_OVERVIEW.md`
- 书本文本
## 你的职责范围
- **原则 (principles)**: 作者明确提出的"应该如何" / "不应该如何"的断言
- **清单 (checklists)**: 结构化的项目列表 (投资检查清单 / 决策前自问清单)
- **规则 (rules)**: 可直接拿来套用的判断规则 (如 "永远不要...当..." / "只有在...时才...")
- **格言/箴言 (maxims)**: 作者反复强调、带有行动指导意义的短句
## 不属于你的
- 思维模型 / 推理结构 → `framework-extractor`
- 作者亲自用过的案例 → `case-extractor`
- 反例 / 警告的失败模式 → `counter-example-extractor`
- 术语 → `glossary-extractor`
## 识别信号
- "必须..." / "不要..." / "要记住..." / "三条原则..."
- 编号列表 (1. 2. 3.) 或项目符号
- "每当...就要..." / "只有...才能..."
- 作者在多个场合重复的同一条断言
- 毛选里的 "凡是...都..." / "...必须..."
- 段永平的 "stop doing list" 类项目
## 输出格式
```yaml
- id: p01
title: Stop Doing List
type: principle
source_chapter: 第 2 部分 · 投资篇
source_quote: |
"不做什么比做什么更重要。我们的 stop doing list 比 to do list 长得多。"
summary: |
主动列出"绝对不做"的清单, 比列"要做"的清单更能防止重大错误。
适用于投资、战略、职业选择等"错一次就伤筋动骨"的场景。
tags: [principle, decision, negative-checklist]
```
## 自检
- [ ] 每条都是"可直接应用的规则",不是思维结构 (后者给 framework-extractor)
- [ ] 有明确原文
- [ ] 引用 ≤150 字 (英文 ≤100 词)
- [ ] 不做筛选
## 常见错误
1. **把描述当原则** — "作者告诉我们投资要谨慎" 不是原则;"绝不投资你看不懂的生意" 是。
2. **把一整章当一条** — 原则必须原子化,一章可能包含 35 条独立原则,要拆开。
3. **和 framework 混淆** — framework 是"怎么想",principle 是"做不做"。一个告诉你推理方式,一个告诉你 yes/no。

View File

@ -0,0 +1,83 @@
# RIA-TV++ 方法论总览
本文是 cangjie-skill 所用 SOP 的设计说明,解释"为什么这么做"。执行时的具体步骤请读 `SKILL.md``methodology/01-*``07-*`
## 命名
**RIA-TV++** =
- **RIA** — 赵周 (《这样读书就够了》) 的便签拆书法: Reading / Interpretation / Appropriation
- **TV** — Triple Verification,借自 nuwa-skill 的三重验证
- **++** — 面向 agent 执行的扩展: E (Execution 可执行步骤) + B (Boundary 边界)
## 思想来源
| 来源 | 借鉴内容 |
|---|---|
| Mortimer Adler 《如何阅读一本书》 | 阶段 0: 分析阅读三阶段 (结构/解释/批判) |
| 赵周 RIA 拆书法 | 阶段 2: R-I-A1-A2 基本骨架, 尤其 A2 → trigger |
| Niklas Luhmann Zettelkasten | 原子化 + 链接 + 用自己的话重写 |
| Tiago Forte Progressive Summarization | 阶段 4 的"可验证压缩链条"思想 |
| nuwa-skill | 阶段 1 并行 extractor + 阶段 1.5 三重验证 |
| darwin-skill | 阶段 4 test-prompts.json 格式 + 可进化性 |
## 根本洞察
**现有读书方法论都是为人类读者蒸馏,不是为 agent 执行者蒸馏。**
| 维度 | 给人看 | 给 agent 用 (cangjie-skill 目标) |
|---|---|---|
| 关键字段 | 故事 / 金句 / 情感钩子 | trigger / 可执行步骤 / 判停标准 |
| 失败模式 | 读完就忘 | trigger 不准 → 永不调用或乱调用 |
| 成功标准 | 读者"有收获" | 真实问题被解决 |
所以 RIA-TV++ 的所有"扩展"(TV / E / B / test-prompts) 都是为了解决这个目标迁移带来的新问题。
## 流水线
```
┌───────────────────┐
│ 阶段 0: 整书理解 │ Adler 四步
└─────────┬─────────┘
│ BOOK_OVERVIEW.md
┌───────────────────┐
│ 阶段 1: 并行提取 │ 5 个 sub-agent 同时跑
└─────────┬─────────┘
│ candidates/
┌───────────────────┐
│ 阶段 1.5: 三重验证 │ V1 跨域 / V2 预测力 / V3 独特性
└─────────┬─────────┘
│ 通过单元 + rejected/
┌───────────────────┐
│ 阶段 2: RIA++ 构造 │ R / I / A1 / A2 / E / B
└─────────┬─────────┘
│ 每个 skill 的 SKILL.md
┌───────────────────┐
│ 阶段 3: 链接 │ Zettelkasten + INDEX.md
└─────────┬─────────┘
┌───────────────────┐
│ 阶段 4: 压力测试 │ test-prompts.json + 盲测 + 回炉
└─────────┬─────────┘
┌───────────────────┐
│ 阶段 5: 交付 │ DIGEST.md 精华长文 + 安装到 skills 目录
└───────────────────┘
可喂给 darwin-skill 自动进化
```
## 不变量 (任何迭代都不能违反)
1. **原子性**: 一个 skill 只做一个方法论单元,不能"大而全"
2. **可追溯**: 每个 skill 必须有原文引用,指向源书章节 (视频指向时间戳/分 P)
3. **可验证**: 每个 skill 必须通过三重验证 + 压力测试
4. **可进化**: 每个 skill 必须附带 darwin 兼容的 test-prompts.json
5. **用户参与**: 阶段 0 之后必须让用户确认骨架; 阶段 1.5 之后必须让用户确认入选名单
6. **可交付**: 流程终点是"用户能调用"— skill 必须被安装到 skills 目录,读者需求由 DIGEST.md 承接

View File

@ -0,0 +1,57 @@
# 阶段 0 — 整书理解 (Adler 分析阅读)
## 目标
在动手拆书之前,先**真正读懂这本书**。没有这一步,拆出来的 skill 只是一堆金句集,会带上作者的盲点却不自知。
产出: `books/<slug>/BOOK_OVERVIEW.md` (按 `templates/BOOK_OVERVIEW.md.template` 填充)。
## 四步 (前三步来自 Adler, 第四步是本 skill 新增)
### 步骤 1 — 结构 (Structural)
识别书的"骨架",回答:
- **这本书属于什么类型?** (方法论 / 传记 / 哲学 / 实操手册 / ...)
- **它的主旨用一句话说是什么?** — 必须真的能压缩到一句
- **它的主要部分如何组合成一个整体?** — 列出 37 个一级论点并标出它们的关系 (并列 / 递进 / 对比 / 反驳)
- **作者试图解决的核心问题是什么?**
### 步骤 2 — 解释 (Interpretive)
- **关键术语**: 列出作者反复使用、有特定含义的概念词,给每个词写一句"作者本人的用法"定义 (不是字典定义)
- **核心命题**: 用你自己的话重述作者的 515 个核心主张
- **论证链**: 这些主张之间是怎么推导的? 作者用什么证据支撑?
### 步骤 3 — 批判 (Critical) ★ 最容易被跳过也最重要
Adler 原话: "在没有找出论证中的错误之前,你不能不同意作者。" 反过来: **在找出作者的局限之前,你也不能完全同意。**
必须回答:
- **作者的时代局限**: 这本书写于什么时期? 哪些前提可能已经不成立?
- **作者的立场盲点**: 作者的身份 / 行业 / 文化背景让他忽略了什么?
- **未被证明的假设**: 作者把什么当成了不言自明但其实需要论证的东西?
- **反对意见**: 如果有人要反驳这本书,最强的论点会是什么?
这一步的产出会直接成为每个 skill 的 **Boundary (B)** 字段来源。
### 步骤 4 — 应用潜力 (Applicability, 本 skill 新增)
- **哪些内容可以 skill 化?** — 框架 / 清单 / 原则 / 决策程序
- **哪些内容不适合 skill 化?** — 纯史料 / 纯故事 / 纯情感 (但可作为其他 skill 的 example)
- **预估 skill 数量**: 给一个粗略区间 (不要硬凑)
- **预估优先级**: 从"最能赋能普通人"的角度给候选 skill 排序
## 质量门 (进入阶段 1 之前必须满足)
- [ ] 主旨能用一句话说清
- [ ] 骨架列出 37 个一级论点
- [ ] 关键术语词典有 ≥5 条
- [ ] 批判阶段至少列出 3 条作者局限 (这一步没做到位就不能继续)
- [ ] 已向用户展示 BOOK_OVERVIEW.md 并得到确认
## 常见失败模式
1. **跳过批判阶段** — 导致 skill 把作者的偏见当真理
2. **骨架不是"作者的骨架",而是自己的想法** — 注意你在写摘要还是在写读后感
3. **术语定义用字典 / 常识而非作者的特定用法** — 作者用"能力圈"和字典用"能力圈"不是一回事

View File

@ -0,0 +1,69 @@
# 阶段 1 — 5 个 sub-agent 并行提取
## 目标
不用单一视角读一遍,而是**同时从 5 个不同角度扫描全书**,最大化候选单元覆盖率。
## 为什么要并行
- **覆盖**: 单一视角会漏。框架提取器找不到的"反例",反例提取器会找到。
- **速度**: Claude Code 的 Agent 工具支持并行,不用白不用。
- **独立性**: 每个 extractor 独立判断,避免互相污染 — 三重验证才能真正起作用 (V1 跨域要求"独立出现")
## 5 个 sub-agent
每个 sub-agent 接收:
- `BOOK_OVERVIEW.md` (阶段 0 产出, 提供全局上下文)
- 书本文本 (或文本路径)
- 对应的 extractor prompt (`extractors/<type>-extractor.md`)
并在一次调用中通过 Agent 工具 **同时 spawn 5 个**,不是串行。
**降级方案**: 当前环境不支持并行 sub-agent 时,用同样 5 个 extractor prompt 串行执行 (每次以"干净视角"执行一个 extractor 的职责,不带上一个 extractor 的判断),产出格式不变。
## 长文本分块策略 (超出单个 sub-agent 上下文时)
一本大部头 (如全五卷选集) 或几小时视频的转写稿,可能超出单个 sub-agent 能一次读完的上下文。此时:
1. **切块**: 按章节/卷/分 P 等自然边界切块,每块控制在 sub-agent 能连同 `BOOK_OVERVIEW.md` 一起舒适读完的规模 (经验值: 单块 ≤5 万字)
2. **全局锚点**: 每一块都必须附带 `BOOK_OVERVIEW.md` — 它是 extractor 判断"这段内容在全书中扮演什么角色"的锚点,不能省
3. **逐块扫描**: extractor 逐块提取候选,标注每条候选来自哪一块 (source_chapter 字段天然承载)
4. **块间汇总**: 全部块扫完后,extractor 自己先做一轮合并 — 同一方法论在多块中出现的,合并成一条并保留所有出处 (这些多出处恰好是阶段 1.5 V1 跨域验证的证据)
5. 汇总后的结果才写入 `candidates/<type>.md`
| # | extractor | 查找对象 | 产出文件 |
|---|---|---|---|
| 1 | framework-extractor | 思维模型 / 决策框架 / 推理方法 | `candidates/frameworks.md` |
| 2 | principle-extractor | 原则 / 清单 / 规则 / 断言 | `candidates/principles.md` |
| 3 | case-extractor | 作者在书中亲自使用的实例 | `candidates/cases.md` |
| 4 | counter-example-extractor | 作者警告的失败 / 反例 / 陷阱 | `candidates/counter-examples.md` |
| 5 | glossary-extractor | 关键概念词典 | `candidates/glossary.md` |
## 每个候选单元的最小字段
无论是哪个 extractor,产出的每条候选单元必须包含:
```yaml
id: f01 # 类型缩写 + 序号
title: 逆向思维 # 简短标题
type: framework # framework / principle / case / counter-example / term
source_chapter: 第三讲 # 书中位置
source_quote: | # 原文引用 ≤150 字 (英文 ≤100 词)
"反过来想,总是反过来想..."
summary: | # 用自己的话,5-10 行
...
tags: [decision, mental-model] # 便于后续链接
```
## 输出前的自检
每个 extractor 在提交候选之前自问:
1. 这个单元**在书中**有明确根据吗? (不是我脑补)
2. 它属于我这个 extractor 的职责范围吗? (不要越界)
3. 它是不是已经在别处被别的 extractor 提取过了? (重复不是问题,阶段 1.5 会合并)
## 不在本阶段做的事
- **不做筛选** — 宁错杀,留给阶段 1.5 三重验证
- **不写 skill** — 只出候选,不出 SKILL.md
- **不做跨单元链接** — 留给阶段 3

View File

@ -0,0 +1,84 @@
# 阶段 1.5 — 三重验证筛选
## 目标
从候选单元池里,筛出**真正值得做成独立 skill 的方法论单元**。通不过的降级为 example / 引用 / 术语,但不独立成 skill。
这是 cangjie-skill 区别于"书摘工具"的核心质量门。
## 三重验证 (全部通过才录取)
### V1 — 跨域验证 (Cross-domain)
**问题**: 这个单元在书中**至少 2 个独立的语境**下有佐证吗?
- "独立"的含义: 不是同一个案例换个说法,而是两个不同的故事/不同的章节/不同的对象都在讲同一个道理
- **通过**: 《穷查理宝典》中"逆向思维"在投资决策、避免灾难、教学方法三个独立场景中都出现 → 通过
- **不通过**: 某个漂亮句子只在一章里出现过一次,没有书内的独立证据 → 降级为金句 example
**为什么**: 在多个语境中反复出现的,才是作者真正想传达的稳定方法论,而不是一时兴起的表达。
### V2 — 预测力测试 (Predictive Power)
**问题**: 能用这个单元,推导出书里没明说的某个问题的答案吗?
- 自己设计一个书中没直接讨论过的场景
- 尝试用这个方法论去分析它
- **通过**: 能得出一个有意义、非平庸的结论 → 通过
- **不通过**: 只能得出"努力就会成功"之类的废话 → 这个单元没有真正的解释力,降级
**为什么**: 真正的方法论必须有**外推能力**。如果它只能复述书里的例子,它是描述不是方法。
### V3 — 独特性检验 (Exclusivity)
**问题**: 这个单元是否是"任何聪明人都会说的常识"?
- 如果把作者名字抹掉,一个对书本领域毫无了解的聪明人也能说出来 → 不通过
- 必须是作者**独特视角 / 反直觉见解 / 独特术语体系** → 通过
- **通过**: 段永平的"stop doing list" — 主动列出不做什么,反常识 → 通过
- **不通过**: "要尊重时间" — 太常识了,没人需要一个 skill 来告诉自己这个
**为什么**: 常识不需要 skill 承载,Claude 本身就知道。只有作者的**差异化见解**才值得固化成 skill。
## 验证执行流程
1. 把阶段 1 的 5 个 candidates/*.md 合并成一个总候选池
2. 去重: 同一方法论被多个 extractor 提取的,合并成一条
3. 对每条候选跑 V1 / V2 / V3,记录判断和理由
4. 通过的,写入 `books/<slug>/verified.md`
5. 未通过的,写入 `books/<slug>/rejected/<id>.md`,**必须写明不通过的是哪一项、原因是什么** (审计价值)
6. **用户轻确认** ★: 把"通过的 N 个候选标题 + 淘汰的 M 个"展示给用户,问一句"这 N 个会做成 skill,有想捞回或砍掉的吗?" 得到确认再进入阶段 2 — 阶段 24 是全流程最耗时的部分,这一句话的成本能避免大量返工
## 输出模板 (verified.md 单条)
```yaml
id: f01
title: 逆向思维
type: framework
V1_cross_domain:
passed: true
evidence:
- 第 3 讲: 投资决策场景
- 第 7 讲: 工程设计场景
- 第 11 讲: 教学方法场景
V2_predictive_power:
passed: true
novel_question: "如果面试官问我一个不知道答案的问题该怎么办?"
derived_answer: "逆问'我最不希望他认为我是什么样的人',从这个反面倒推应该展现什么"
V3_exclusivity:
passed: true
why_not_common: "常识是'要多想',逆向思维是'优先反着想' — 这是反直觉的排序"
→ 进入阶段 2
```
## 常见失败模式
1. **V1 作弊** — 把同一例子换个说法算两处。要求: 必须是不同章节 + 不同对象 + 不同结论。
2. **V2 作弊** — 用一个其实书里讨论过的类似问题冒充"新问题"。要求: 新问题应该让人第一眼不知道书里怎么说。
3. **V3 过松** — 只要"说得比较文雅"就认为不是常识。要求: 看**内容**本身是否反直觉,而不是措辞。
## 数量预期
经验上,一本方法论密集的书 (如《穷查理宝典》) 通过率约 3050%。一本散文类书可能只有 510%。通过率过低 (<5%) 或过高 (>80%) 都要警惕:
- 过低: extractor 可能质量差,要重跑
- 过高: 验证标准可能太松

View File

@ -0,0 +1,90 @@
# 阶段 2 — RIA++ 构造 skill
## 目标
把阶段 1.5 通过的每个方法论单元,构造成一个符合 Claude Code skill 规范的 SKILL.md。
使用模板: `templates/SKILL.md.template`
## RIA++ 六段
### R — Reading (原文)
- 直接引用 ≤150 字 (英文原文 ≤100 词)
- 必须标注出处 (章节 / 页码 / 段落标识; 视频填时间戳或分 P, 播客填集数)
- 若原书是英文,引用英文原文 + 你自己翻译的中文,**不要用现成译本** (避免译者版权 + 译本可能失真)
### I — Interpretation (自述)
- 用**你自己的话**重写方法论的核心骨架
- 515 行
- 检查: 读完这段,一个没读过原书的人能否理解这个方法论在做什么? 若不能,重写。
- 禁止: 照搬原文句子 / 堆砌修辞
### A1 — Past Application (书中案例)
- 作者在书中**亲自**用这个方法论处理过的具体案例
- 至少 1 条,≤3 条
- 每条要点明: 遇到什么问题 → 怎么用这个方法论 → 得出什么结论 → 实际结果如何
这一段的作用是让 skill 在被调用时,agent 有具体的类比素材可用。
### A2 — Future Trigger ★ (最关键)
**这决定了 skill 是否真的会被用起来。**
必须明确:
1. **用户会在什么情境下遇到这类问题?** (场景描述, 35 条)
2. **这些情境的语言信号是什么?** (用户会说什么样的话)
3. **和哪些相邻 skill 不同?** (避免和其他 skill 互相抢调用)
A2 的产出直接写入 skill frontmatter 的 `description` 字段 — Claude 据此决定是否激活 skill。
注意:
- "与相邻 skill 的区分"在本阶段只写**初稿** (依据 verified.md 的单元列表推测),阶段 3 建立链接关系后回填定稿 — 不要在本阶段硬编相邻关系。
- 语言信号建议**中英双写**关键 trigger 词 (用户可能用英文提问,纯中文 description 会降低触发准确率)。
**好的 A2 示例** (来自"逆向思维" skill):
> 用户在纠结一个决策、列举正面理由却理不出头绪时;或在问"怎么做 X 才能成功"时;不适用于纯信息查询类问题。
**坏的 A2 示例**:
> 用户需要思考时。 ← 太宽泛,会误激活
### E — Execution (可执行步骤)
- 把方法论转成 1-2-3 步骤
- 每一步有**可判断的完成标准**
- 如果有判停点 (step 2 之后若 X 则跳到 step 5),显式写出
E 的作用是让 agent 在调用这个 skill 时有明确的执行路径,不是"自由发挥"。
### B — Boundary (边界)
- 什么时候**不要**使用这个 skill (反场景)
- 作者在书里警告过的失败模式
- 来自阶段 0 批判阶段的作者盲点
- 与之相邻但容易混淆的其他方法论
B 的作用是**防止乱调用**。没有 B 的 skill,会在不该用的时候被用,反而帮倒忙。
## Frontmatter 设计
```yaml
---
name: <skill-slug> # kebab-case, 唯一
description: | # A2 的浓缩版, ≤300 字
<何时用 + 何时不用 + 关键 trigger>
source_book: 《穷查理宝典》 查理·芒格
source_chapter: 第三讲
tags: [decision, mental-model, cognitive-bias]
related_skills: [] # 阶段 3 填充
---
```
## 常见失败模式
1. **I 段写成书摘** — 如果读起来像"本章作者说了 X",你在抄书不是在解释。重写。
2. **A2 太宽** — "需要决策时" 这种 trigger 永远不会被精准调用。必须给出**可识别的语言信号**。
3. **E 段只有哲学没有动作** — "保持客观" 不是 step,"列出 3 个最不希望发生的结果" 才是。
4. **缺 B 段** — 没边界的 skill 会被过度调用,最终用户失望。
5. **从 I 直接跳到 E,跳过 A1** — 丢失了"作者亲自用过"的证据,skill 失去权威性。

View File

@ -0,0 +1,46 @@
# 阶段 3 — Zettelkasten 链接 + INDEX
## 目标
把原子 skill 之间的关系显式化,形成一个可导航的网络,而不是一堆孤立文件。
## 三类关系
1. **依赖 (depends-on)**: A 的使用前提是先理解 B
- 例: "检查清单决策" 依赖 "多元思维模型" (因为清单的项来自模型)
2. **对比 (contrasts-with)**: A 和 B 是两种可选方案,看情境选一
- 例: "正向推理" 对比 "逆向思维"
3. **组合 (composes-with)**: A 和 B 经常配合使用
- 例: "能力圈判断" 组合 "安全边际"
## 执行步骤
1. 列出阶段 2 产出的所有 skill
2. 两两扫描,识别是否存在上述三类关系
3. 在每个 skill 的 frontmatter `related_skills` 字段填入:
```yaml
related_skills:
- slug: multi-mental-models
relation: depends-on
- slug: forward-reasoning
relation: contrasts-with
```
4. 在每个 skill 的 SKILL.md 末尾追加"相关 skills"段,用自然语言说明关系
5. **回填 A2**: 链接关系确定后,回到每个 skill 的 A2 段,把阶段 2 留下的"与相邻 skill 的区分"初稿改成定稿 (同时同步 frontmatter `description`)
6. 生成 `books/<slug>/INDEX.md` (模板 `templates/INDEX.md.template`)
7. 把 `candidates/glossary.md` 整理提升为 `books/<slug>/GLOSSARY.md` — 它是所有 skill 共享的术语词典,应在产出根目录可见,而不是埋在审计目录里; INDEX.md 中链接它
## INDEX.md 必须包含
- 书的基本信息 (作者/年份/一句话主旨)
- 所有 skill 的列表,按主题分组
- 引用图 (mermaid flowchart 或 graph)
- 推荐学习顺序 (从依赖关系推出)
## 节制原则
**不要硬造关系**。如果两个 skill 之间没有真正的依赖/对比/组合关系,就不要写 related_skills。宁可稀疏也不要制造虚假链接。
一个经验值: 一本书拆出 10 个 skill,合理的关系数大约是 815 条。低于 5 条说明拆得太独立 (可能单元选得不对),高于 25 条说明在硬凑关系。

View File

@ -0,0 +1,97 @@
# 阶段 4 — 压力测试 (darwin 兼容)
## 目标
在 skill 真正交付之前,用一批测试 prompt 验证它**被调用的精准度**和**被调用后的输出质量**。
不通过的必须回炉 — 不是表面修补 `description` 字段,而是重做阶段 2 的 A2 / E / B。
## 为什么必须做
A2 (trigger) 是拆书里最难的环节。一个 skill 做得再漂亮,trigger 不准就等于不存在。压力测试是**唯一**能在发布前发现 trigger 问题的方法。
## 评测原则: 独立 sub-agent 盲测优先
压力测试要尽量模拟真实调用: 一个没有参与蒸馏过程、看不到预期答案的 agent,面对用户 prompt 时是否会自然激活这个 skill。
优先做法:
- 对每条测试 prompt 启动一个干净的 sub-agent,或在资源有限时对同一个 skill 的一组 prompt 启动一个干净 sub-agent
- 只给 sub-agent: skill 路径或 skill 内容、用户 prompt、可选的相邻 skill 列表
- 不给 sub-agent: `type`、`expected_behavior`、`notes`、通过标准、主流程的判断
- 要求 sub-agent 输出: `would_trigger`、`reason`、`if_triggered_action`
- 主流程再把 sub-agent 输出和 `test-prompts.json` 的预期逐条对比,统计通过率
如果当前环境没有 sub-agent 能力,才退回到主流程自测,并在 `test-results.md` 里标明这是 fallback 结果,可信度低于独立 sub-agent 盲测。
## test-prompts.json 格式 (darwin-skill 兼容)
```json
{
"skill": "inversion-thinking",
"version": "0.1.0",
"test_cases": [
{
"id": "should-trigger-01",
"type": "should_trigger",
"prompt": "我要决定要不要接这个新项目,列了一堆好处但还是没底",
"expected_behavior": "调用 inversion-thinking, 反问'最不希望发生什么'",
"notes": "正面场景: 决策纠结"
},
{
"id": "should-not-trigger-01",
"type": "should_not_trigger",
"prompt": "帮我查一下这个 API 的参数",
"expected_behavior": "纯信息查询, 不应调用任何决策 skill",
"notes": "诱饵: 非决策场景"
},
{
"id": "edge-01",
"type": "edge_case",
"prompt": "我在想晚饭吃什么",
"expected_behavior": "日常琐事, 不应调用 (虽然字面是'决策')",
"notes": "边界: 区分严肃决策和日常选择"
}
]
}
```
## 三类测试缺一不可
| 类型 | 数量 | 目的 |
|---|---|---|
| `should_trigger` | 35 条 | 该调用时是否调用 |
| `should_not_trigger` (诱饵) | 23 条 | 不该调用时是否忍住 |
| `edge_case` | 13 条 | 边界模糊场景的判断是否合理 |
**没有诱饵测试的 skill 一律打回**。因为只测 positive case,skill 总会看起来"很好",但实际部署后会乱激活。
**跨 skill 混淆测试 (硬性要求)**: 诱饵中至少 1 条必须是"应该触发同书另一个 skill"的 prompt。同一本书拆出的 10+ 个 skill 之间互相抢调用,是部署后最常见的真实故障 — 只测"完全无关的场景"发现不了它。盲测时把整包所有 skill 的 name + description 列表给 sub-agent,让它做"该激活哪一个"的选择题,而不只是"要不要激活这一个"的判断题。
## 执行流程
1. 对每个 skill,按模板写 `test-prompts.json`
2. 对每个 test_case 做独立盲测: 隐藏 `type` / `expected_behavior` / `notes`,让 sub-agent 判断"是否会调用这个 skill",记录判断和理由
3. 主流程对照 `test-prompts.json` 判卷:
- `should_trigger`: sub-agent 应明确调用该 skill,且执行动作符合 `expected_behavior`
- `should_not_trigger`: sub-agent 不应调用该 skill,诱饵测试容错为 0
- `edge_case`: sub-agent 的判断要符合 `expected_behavior` 中定义的边界理由
4. 统计通过率:
- **100% 通过** → 接受
- **≥80% 通过** → 分析失败 case, 决定是修 A2 还是修测试 (但修测试要警惕自我合理化)
- **<80% 通过** **必须回炉重做阶段 2**,不是小修
5. 修复后重新跑,直到通过
## 判断"修 skill 还是修测试"
- 如果失败的 case 暴露了 skill **trigger 描述有歧义**: 修 skill
- 如果失败的 case 是一个你**之前没想到的合理场景**: 可能需要修 skill 以覆盖或明确排除
- 如果失败的 case 是你**为了凑诱饵而设计过狠的场景**: 修测试 (但必须记录理由)
## 输出
- `<skill-dir>/test-prompts.json` — darwin 兼容格式
- `<skill-dir>/test-results.md` — 本次测试的通过率和失败分析 (审计用)
## 下一步
所有 skill 全部通过后,进入阶段 5 (交付),见 `07-stage5-deliver.md`: 生成面向读者的 DIGEST.md 精华长文,并把 skill 安装到用户的 skills 目录 — 之后才向用户提 darwin-skill 自动进化。

View File

@ -0,0 +1,64 @@
# 阶段 5 — 交付 (DIGEST + 安装)
## 目标
把流水线的产出真正送到两类使用者手里:
1. **Agent** — skill 必须被安装到宿主环境的 skills 目录,否则永远不会被调用
2. **人类读者** — 用一篇 `DIGEST.md` 精华长文承接"不想读全书,但想看精华"的需求
这两件事都不做,前面五个阶段的产出就只是一堆躺在仓库里的文件。
## 第 1 步 — 生成 DIGEST.md (面向读者的精华长文)
### 为什么放在最后而不是阶段 0
阶段 0 的 `BOOK_OVERVIEW.md` 是**流水线的全局上下文**,会被喂给每个 sub-agent — 它必须精炼,不能为了可读性加长。而 DIGEST 面向人类读者,放在流程终点写,手里的材料最全:
- `BOOK_OVERVIEW.md` — 骨架 / 术语 / 批判
- `verified.md` — 通过三重验证的方法论 (已经筛掉了水分)
- 各 skill 的 SKILL.md — 每个方法论的解释 / 案例 / 边界
- `candidates/cases.md` / `counter-examples.md` — 案例池和反例池
- `GLOSSARY.md` — 术语词典
**DIGEST 是"蒸馏后的再呈现",不是"重新摘要"** — 它只写通过了验证的内容,所以浓度天然高于普通书摘。
### 篇幅与结构要求
- **篇幅**: 500010000 字 (视内容体量伸缩; 一篇 20 分钟视频不必硬凑 5000 字)
- **组织**: 按书的骨架 (BOOK_OVERVIEW 的一级论点) 组织章节,不按 skill 列表组织 — 读者要的是"这本书讲了什么",不是产物清单
- 每个核心方法论写一小节: 它解决什么问题 → 核心逻辑 → 书中最有代表性的案例 → 什么时候会失效
- 必须包含**反例/陷阱**一节 (来自 counter-examples) 和**作者的局限**一节 (来自阶段 0 批判) — 只报喜不报忧的精华是软文,不是蒸馏
- 每个方法论小节末尾链接对应的 skill 目录,读者想深入时有路径
- 允许适量引用原文金句 (每段引用遵守 ≤150 字 / 英文 ≤100 词)
模板: `templates/DIGEST.md.template`,输出到 `books/<slug>/DIGEST.md`
### 质量自检
- [ ] 一个没读过原书的人,读完 DIGEST 能复述这本书的主旨、3 个以上核心方法论、2 个以上陷阱
- [ ] 没有出现"未通过三重验证"的内容被当作核心方法论呈现
- [ ] 有批判/局限部分,不是全程吹捧
- [ ] 每个方法论小节都有 skill 链接
## 第 2 步 — 安装 skill 到宿主环境
产出目录 `books/<slug>/<skill-slug>/` 只是构建产物,宿主 (Claude Code / Cursor 等) 不会从这里加载 skill。必须安装:
1. **问用户装哪里** (一次性问清,不要逐个 skill 问):
- 用户级: `~/.claude/skills/<skill-slug>/` (所有项目可用)
- 项目级: `<project>/.claude/skills/<skill-slug>/``.cursor/skills/<skill-slug>/`
- 用户也可能只想要仓库形式 (发布到 GitHub),那就跳过安装
2. **只安装通过阶段 4 测试的 skill** — 未通过的留在构建目录里回炉
3. 复制 (或 symlink) 整个 skill 目录,含 `SKILL.md``test-prompts.json`
4. 安装后抽 12 个 skill 用一句 should_trigger 的 prompt 验证宿主能加载并触发
## 第 3 步 — 收尾汇报
告诉用户:
> 已完成。产出: N 个 skill (已安装到 <位置>)、INDEX.md、GLOSSARY.md、DIGEST.md (精华长文,约 X 字)。
> 如需持续进化,可以喂给 darwin-skill: `darwin evolve books/<slug>/`
> 它会用这里的 test-prompts.json 做 ratcheting 自动进化。
最后把 `PIPELINE_STATE.md` 标记为全部完成。

View File

@ -0,0 +1 @@
404: Not Found

View File

@ -0,0 +1 @@
404: Not Found

View File

@ -0,0 +1 @@
404: Not Found

View File

@ -0,0 +1 @@
404: Not Found

View File

@ -0,0 +1 @@
404: Not Found

View File

@ -0,0 +1 @@
404: Not Found

View File

@ -0,0 +1,31 @@
# 股票投研体系 - 技能地图
生成时间: 2026-07-11 17:30
状态: 理论学习完成,进入模拟交易阶段
## 已蒸馏 Skill
| # | 文件 | 主题 | 核心要点 |
|---|------|------|---------|
| 1 | stock_phase1_basics.md | A股交易规则 | T+1/涨跌幅/集合竞价 |
| 1 | stock_phase1_basics.md | K线基础 | 阳线/阴线/十字星/影线 |
| 2 | stock_phase2_technical.md | MACD | 金叉死叉/顶底背离 |
| 2 | stock_phase2_technical.md | KDJ | 超买超卖/20-80区间 |
| 2 | stock_phase2_technical.md | 成交量与价格 | 放量/缩量/地量 |
| 3 | stock_phase3_fundamental.md | 三张报表 | 利润表/资产负债表/现金流量表 |
| 3 | stock_phase3_fundamental.md | 估值方法 | PE/PB/PEG/DCF |
## 下一阶段
Phase 5: 模拟交易与策略验证
- 选择聚宽/掘金模拟平台
- 搭建回测环境
- 设计第一个策略MACD金叉/死叉
- 模拟账户运行,达到预期后实操
## 方法论来源
仓颉 skill (cangjie-skill) RIA-TV++ 流水线
- 项目: https://github.com/kangarooking/cangjie-skill
- 本地: ~/.hermes/cangjie-skill/
- 集成器: ~/.hermes/scripts/cangjie_distill.py

View File

@ -0,0 +1,65 @@
# 股票基础概念 Skill
## 技能名称A股交易规则
### R原文引用
- A股实行T+1制度当天买次日才能卖
- 涨跌幅限制主板±10%,创业板/科创板±20%
- 集合竞价9:15-9:25申报9:25-9:30不接受新申报
- 连续竞价9:30-11:30、13:00-15:00
- ST股涨跌±5%
- 注册制新股上市前5日无涨跌幅限制
### I自己话重写
A股有明确的交易时间和限制规则。T+1意味着今天买的股票今天不能卖必须等到明天。不同板块涨跌幅不同主板±10%是最常见的创业板和科创板波动更大±20%。交易分两个时段:开盘前的集合竞价定开盘价,交易时间的连续竞价实时成交。
### A1案例
牧尘在下午2:30看盘想买某主板股票当前价10元若当天买入了次日才能卖出。如果次日开盘直接涨停+10%到11元就赚钱了。但如果次日低开-10%到9元就亏损了。
### A2触发场景
- 想日内做T+0高抛低吸A股不允许必须次日才能卖
- 看到某股当日大跌8%,判断要反弹买入?买入后当日不能卖,要承担次日开盘的不确定性
- 新股上市前5日无涨跌幅限制首日可能涨300%也可能跌50%
### E可执行步骤
1. 记住T+1任何时候买入股票当天不能卖
2. 看涨跌幅主板±10%、创业板/科创板±20%、ST±5%
3. 集合竞价下单9:15-9:25可以撤单9:25-9:30不能撤不能新报
4. 连续竞价9:30后实时成交13:00-15:00继续
### B边界与盲点
- 港股、美股是T+0可以日内多次买卖A股不行
- 涨停板有时买不进去(卖单少),跌停板卖不出去(买单少)
- 基金、ETF、部分可转债是T+0
---
## 技能名称K线基础
### R原文引用
- 阳线(红/实心):收盘>开盘,上涨
- 阴线(绿/空心):收盘<开盘下跌
- 十字星:收盘≈开盘,多空均衡
- 上影线:最高到收盘/开盘,上涨受阻
- 下影线:最低到收盘/开盘,底部支撑
### I自己话重写
K线是价格的快照。红色代表涨绿色代表跌中国习惯与西方相反。十字星表示多空力量差不多可能要变盘。上影线长说明上方压力大涨不上去下影线长说明下方支撑强跌不下去。
### A1案例
某股开盘10元涨到10.5元最高收盘10.3元最低9.8元。就形成了上影线长到10.5)的阳线,说明当天涨了但上方有压力。
### A2触发场景
- 看到长上影线的阳线:要警惕,可能是主力出货
- 看到长下影线的阴线:要关注,可能是底部有人接盘
- 连续出现十字星:市场在犹豫,可能要选方向了
### E可执行步骤
1. 先看颜色:红涨绿跌(中国)
2. 看实体长短:实体越长趋势越强
3. 看影线:上影线长=上方压力,下影线长=下方支撑
4. 十字星+放大成交量=变盘信号
### B边界与盲点
- 单根K线信息有限要结合前后K线看
- 日K线容易被操控分时图能看到日内细节
- 极端行情下K线形态会失真

View File

@ -0,0 +1,101 @@
# 技术分析框架 Skill
## 技能名称MACD指标
### R原文引用
- MACD = 12日EMA - 26日EMA
- Signal线 = MACD的9日EMA
- 金叉MACD上穿Signal线看涨
- 死叉MACD下穿Signal线看跌
- 柱状图MACD-Signal线红柱=多头,绿柱=空头
- 顶背离价格新高但MACD没新高警惕回调
- 底背离价格新低但MACD没新低警惕反弹
### I自己话重写
MACD是趋势跟踪指标由快线DIF和慢线DEA/Signal组成。金叉就是快线上穿慢线代表短期上涨动力超过中期可能启动上涨行情。背离是最重要的信号价格创新高但MACD没跟上说明上涨动力衰竭要小心。
### A1案例
某股从10元涨到15元MACD也创新高。再从15元涨到18元但MACD没创新高反而在下降——这就是顶背离。之后股价大跌到13元。
### A2触发场景
- DIF和DEA都在0轴上方 + 金叉 = 强势上涨信号,可考虑买入
- DIF和DEA都在0轴下方 + 金叉 = 弱势反弹,谨慎
- 顶背离出现在高位 + 放量下跌 = 逃顶信号
- 底背离出现在低位 + 缩量整理 = 抄底信号
### E可执行步骤
1. 打开K线图调出MACD指标默认参数12,26,9
2. 看DIF和DEA的位置0轴上方多头下方空头
3. 看交叉DIF上穿DEA=金叉DIF下穿DEA=死叉(卖)
4. 看柱状图颜色和长度:红柱增长=多头强势,绿柱增长=空头强势
5. 找背离画价格和MACD的高点/低点,不同步就要警惕
### B边界与盲点
- MACD是趋势指标在震荡市会反复金叉死叉失效
- 参数可以调整(更敏感/更滞后默认12,26,9是经典参数
- 日线MACD信号滞后适合中长期短周期要用小时线
---
## 技能名称KDJ指标
### R原文引用
- K值快速指标对价格敏感
- D值慢速指标更稳定
- J值3*K-2*D波动最大
- KDJ金叉K上穿D+ 在20以下 = 超卖区买入信号
- KDJ死叉K下穿D+ 在80以上 = 超买区卖出信号
### I自己话重写
KDJ像摆动指标专门看超买超卖。K和D在0-100之间波动80以上是超买区涨太多了可能跌20以下是超卖区跌太多了可能涨。J值最敏感波动最大适合辅助判断。
### A1案例
某股连续下跌KDJ跌到10以下J值甚至是负数这是严重超卖。之后股价反弹KDJ从低位金叉股价从8元涨到10元。
### A2触发场景
- KDJ在20以下金叉 + 成交量放大 = 买入信号
- KDJ在80以上死叉 = 考虑减仓或卖出
- KDJ高位钝化一直在80以上强势股可能继续涨别过早下车
- KDJ低位钝化弱势股可能继续跌别急着抄底
### E可执行步骤
1. KDJ默认参数9,3,3
2. 关注20和80这两个关键值
3. 金叉K上穿D在20附近效果好
4. 死叉K下穿D在80附近效果好
5. J值>100或<0时要警惕极端行情
### B边界与盲点
- KDJ在震荡市效果好在单边市容易反复钝化
- 单独用KDJ不够要结合MACD和成交量
- 短线交易者更常用KDJ长线参考MACD
---
## 技能名称:成交量与价格
### R原文引用
- 放量上涨:健康,看涨信号
- 缩量上涨:可能见顶,动力不足
- 放量下跌:恐慌抛售,可能见底
- 缩量下跌:观望,可能盘整
- 地量见地价:极度缩量后可能反转
### I自己话重写
量是价的先行指标。有上涨,必须有资金推动。放量上涨说明资金认可,还在买;缩量上涨说明买的人少了,纯靠情绪撑。地量(历史最低成交量)往往出现在市场底部,因为大家都观望不动了。
### A2触发场景
- 放量阳线突破重要均线/压力位 = 有效突破,可跟进
- 缩量上涨到前期高点附近 = 可能是假突破
- 放量下跌 + 大阴线 = 主力出逃,不要接飞刀
- 地量 + 十字星 = 可能变盘,关注
### E可执行步骤
1. 看量比(当日成交量/历史平均),>1.5为明显放量
2. 对比同期历史成交量,判断是放量还是缩量
3. 量和价要配合看:健康=同向,异常=背离
4. 关注地量:连续缩量后出现放量选择方向
### B边界与盲点
- 不同股票股性不同,活跃股和蓝筹股的成交量不是一个概念
- 复牌第一天、重大消息前后成交量会失真
- 主力可以用对倒(自己实民自己)制造放量假象

View File

@ -0,0 +1,65 @@
# 基本面分析 Skill
## 技能名称:三张报表
### R原文引用
- 利润表:展示收入、成本、利润
- 资产负债表:展示资产、负债、净资产
- 现金流量表:展示现金流入流出
- 经营现金流>净利润:利润质量好
- 商誉过高:警惕减值风险
### I自己话重写
三张报表从三个角度透视一家公司。利润表看赚不赚钱,资产负债表看家底厚不厚,现金流量表看口袋里有没有真金白银。经营现金流比净利润大,说明赚的是真钱(应收账款少);商誉过高是个雷,一旦减值利润就暴跌。
### A1案例
某公司利润表显示年赚10亿但经营现金流是负的2亿——说明利润都是应收账款没收到现金。这种利润质量很差一旦坏账计提当期利润会大幅缩水。
### A2触发场景
- 看到利润增长但经营现金流持续为负 = 利润质量差
- 商誉占总资产超过30% = 关注年报商誉减值测试
- 资产负债率突然大幅上升 = 可能有收购或财务异常
### E可执行步骤
1. 先看现金流量表:经营现金流>0是底线
2. 再看利润表:收入和利润是否稳定增长
3. 最后看资产负债表:资产结构是否健康
4. 三个表要对比看,关联科目的勾稽关系要一致
### B边界与盲点
- 财报可以被美化(应收账款、关联交易)
- 季度报表信息量有限,年报最全面
- 不同行业报表特点不同,拿科技股和银行股不能同一个标准
---
## 技能名称:估值方法
### R原文引用
- PE市盈率适合稳定增长行业
- PB市净率适合金融、周期行业
- PEG = PE/增长率,<1为低估
- DCF现金流折现适合高确定性企业
### I自己话重写
估值就是给公司定价。PE是市场最常用的看的是"多少年回本"PB是看"破产清算值多少"PEG考虑增长成长股用DCF最严谨但需要对未来现金流做预测。不同行业用不同估值方法才合理。
### A1案例
银行股PE只有5但PB只有0.6——市场给这么低是因为银行业务同质化、杠杆高。科技股PE50但还在涨因为市场认为增长快。单纯看PE高低判断贵贱是不对的。
### A2触发场景
- PE<10的低估值股票 = 检查是否有陷阱周期股/衰退行业
- PEG<1的成长股 = 相对低估有安全边际
- 行业对比时用PB更公平金融、地产、能源
- 高PE股票要有高增长预期支撑否则就是泡沫
### E可执行步骤
1. 记住各行业PE中枢消费20-30科技40-60银行5-8
2. 用PE前先看利润增速增速快的可以给更高PE
3. PB适合金融、地产、周期股
4. DCF参数敏感不确定性大作为参考
### B边界与盲点
- PE容易被会计处理操控一次性收益/减值)
- 低PE可能是夕阳行业高PE可能是成长股
- DCF的"精确错误":模型算得很精确,但假设错了结论就错了
- 估值是艺术不是科学,模糊正确比精确错误好

233
scripts/cangjie_distill.py Normal file
View File

@ -0,0 +1,233 @@
#!/usr/bin/env python3
"""
仓颉 skill 集成器 知识蒸馏引擎
================================
把书/视频/播客里的方法论蒸馏成可调用的 AI skills
集成到小唯的学习体系中
用法:
cangjie_distill.py distill <source_text> <title> 蒸馏文本为 skill
cangjie_distill.py phase <n> <source_text> <title> 只跑指定阶段
cangjie_distill.py verify <skill_dir> 压力测试验证
"""
import json, os, re, sys, subprocess
from datetime import datetime
from pathlib import Path
HOME = os.path.expanduser("~")
HERMES = HOME + "/.hermes"
CJ = HERMES + "/cangjie-skill"
OUTPUT = HERMES + "/cangjie-skills"
os.makedirs(OUTPUT, exist_ok=True)
def log(msg):
print(f"[CANGJIE] {msg}", flush=True)
def shell(cmd, timeout=30):
try:
r = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=timeout)
return r.returncode, r.stdout.strip(), r.stderr.strip()
except subprocess.TimeoutExpired:
return -1, "", "timeout"
# ===================== RIA-TV++ 流水线 =====================
def stage0_overview(source_text, title):
"""阶段0: 整体内容理解Adler分析阅读法"""
log("Stage 0: 整体内容理解...")
system_prompt = open(CJ + "/methodology/01-stage0-adler.md").read()
prompt = f"""请用Adler分析阅读法分析以下内容输出结构化的 BOOK_OVERVIEW.md
内容标题: {title}
---
{source_text[:8000]}
---"""
return call_llm(prompt, system_prompt)
def stage1_extract(source_text, title):
"""阶段1: 并行提取5类方法论单元"""
log("Stage 1: 并行提取...")
extractors = {
"framework": CJ + "/extractors/framework-extractor.md",
"principle": CJ + "/extractors/principle-extractor.md",
"case": CJ + "/extractors/case-extractor.md",
"counter": CJ + "/extractors/counter-example-extractor.md",
"glossary": CJ + "/extractors/glossary-extractor.md",
}
results = {}
for name, path in extractors.items():
if os.path.exists(path):
extractor = open(path).read()
prompt = f"""基于以下内容,提取 {name} 类型的方法论单元:
内容标题: {title}
---
{source_text[:6000]}
---
{extractor}"""
results[name] = call_llm(source_text[:6000], extractor)
else:
results[name] = ""
return results
def stage2_triple_verify(candidates):
"""阶段2: 三重验证筛选"""
log("Stage 2: 三重验证...")
verify_doc = open(CJ + "/methodology/03-stage1.5-triple-verify.md").read()
verified = []
for item in candidates:
prompt = f"""验证以下候选方法论是否通过三重检验:
{item}
{verify_doc}
输出格式
- 通过: [PASS] + 简短原因
- 不通过: [FAIL] + 原因"""
result = call_llm(item, verify_doc)
if "[PASS]" in result:
verified.append(item)
log(f" 三重验证通过率: {len(verified)}/{len(candidates)}")
return verified
def stage3_ria_plus(verified_items, title):
"""阶段3: RIA++ 构造"""
log("Stage 3: RIA++ 构造...")
ria_doc = open(CJ + "/methodology/04-stage2-ria-plus.md").read()
skills = []
for item in verified_items:
prompt = f"""将以下方法论构造为 RIA++ 结构:
原始内容: {title}
{item}
{ria_doc}
输出格式按RIA++模板
## Skill名称
### R原文引用
### I自己话重写
### A1书中案例
### A2未来触发场景
### E可执行步骤
### B边界与盲点"""
result = call_llm(item, ria_doc)
skills.append(result)
return skills
def call_llm(user_msg, system_msg="", model="minimaxai/minimax-m2.7"):
"""调用 NewAPI LLM"""
import urllib.request
payload = json.dumps({
"model": model,
"messages": [
{"role": "system", "content": system_msg},
{"role": "user", "content": user_msg},
],
"max_tokens": 2000,
"temperature": 0.7,
}).encode()
req = urllib.request.Request(
"http://127.0.0.1:3000/v1/chat/completions",
data=payload,
headers={"Content-Type": "application/json", "Authorization": "Bearer 0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP"},
)
try:
with urllib.request.urlopen(req, timeout=60) as resp:
data = json.load(resp)
return data["choices"][0]["message"]["content"]
except Exception as e:
return f"Error: {e}"
def distill(source_text, title, output_dir=None):
"""完整蒸馏流程"""
slug = re.sub(r'[^\w\u4e00-\u9fff]+', '_', title)[:40]
out = output_dir or (OUTPUT + "/" + slug)
os.makedirs(out, exist_ok=True)
log(f"开始蒸馏: {title} -> {out}")
# Stage 0: 整体理解
overview = stage0_overview(source_text, title)
with open(out + "/BOOK_OVERVIEW.md", "w") as f:
f.write(f"# {title}\n\n{overview}\n")
# Stage 1: 并行提取
candidates = stage1_extract(source_text, title)
# 展平候选
all_candidates = []
for name, content in candidates.items():
if content:
# 简单切分段落为候选
for chunk in content.split("\n\n"):
if len(chunk) > 50:
all_candidates.append(chunk.strip())
# Stage 2: 三重验证
verified = stage2_triple_verify(all_candidates[:20]) # 限制数量
# Stage 3: RIA++ 构造
skills = stage3_ria_plus(verified, title)
# 保存 skills
os.makedirs(out + "/skills", exist_ok=True)
for i, skill in enumerate(skills, 1):
with open(f"{out}/skills/skill_{i:03d}.md", "w") as f:
f.write(skill)
# 生成 INDEX
index = f"# {title} - 技能地图\n\n"
index += f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}\n\n"
index += f"{len(skills)} 个验证通过的 skill\n\n"
for i in range(len(skills)):
index += f"- Skill {i+1}: 见 skills/skill_{i+1:03d}.md\n"
with open(out + "/INDEX.md", "w") as f:
f.write(index)
log(f"蒸馏完成! 产出 {len(skills)} 个 skill -> {out}")
return out
if __name__ == "__main__":
cmd = sys.argv[1] if len(sys.argv) > 1 else "help"
if cmd == "distill":
if len(sys.argv) < 4:
print("用法: cangjie_distill.py distill <source_text_file> <title>")
sys.exit(1)
text_file, title = sys.argv[2], sys.argv[3]
with open(text_file) as f:
source = f.read()
distill(source, title)
elif cmd == "help":
print(__doc__)
else:
print(__doc__)