Skill 健康监督
> 防止 Skill 悄悄臃肿、沉默退化、引用断链、版本自相矛盾。月度定时 + 修改后自动触发 + 用户手动调用。
触发条件
- 每月 1 日 9:00 定时执行
- 任何
SKILL.md被 Edit/Write 修改后,Agent 自主触发 - 用户说「检查技能健康」「skill健康」「skill体检」
> ⚠️ 实际约束:若运行环境未实现 Edit 后自动回调(部分环境仅软约定),则以「用户手动调用 / 月度定时」为兜底,不得因此跳过检查。
扫描项(12项)
| # | 检查项 | 判定 | 触发动作 |
|---|---|---|---|
| 1 | 行数 | wc -l → 任一 SKILL.md > 500 |
🔴 → 瘦身方案 |
| 2 | 增长比 | 最近5版只增不减 → 臃肿趋势 | 🟡 → 预警提示 |
| 3 | 🔒密度 | 🔒 标记数 / 总行数 > 5% → 铁律通胀 |
🟡 → 审查建议 |
| 4 | 死引用(断链)🔴 | SKILL.md 引用了 references/ assets/ scripts/ 下文件,但文件不存在 → 硬断链 |
🔴 → 立即修复路径或补文件 |
| 5 | 孤儿文件(零引用)🟢 | 目录下存在 .md/.html/.py 等,但 SKILL.md 全程零引用(如 assets/ 下 3 个 HTML 模板) |
🟢 → 清理建议 / 确认接入 |
| 6 | 引用存在性校验 🔴 | 提取 SKILL.md 中脚本路径(scripts/*.py/<SKILL_DIR>/scripts/*.py)与相对 .md 路径 → 逐一验证目标真实存在;疑似 DB 表名(stats_*/beike_*/guanshi_*) → 🟡 列出提示核对 |
🔴 脚本/路径不存在 / 🟡 表名待核 |
| 7 | 重复规则 | 同一规则在 SKILL + references 两处都出现 | 🟢 → 去重建议 |
| 8 | 版本一致 🔒 | ① _DEPENDENCY_MAP.md 版本 vs frontmatter 一致;② SKILL 内部三处自洽:frontmatter version / H1 标题 (vX.Y) / 版本记录表最大版本行 三者一致 |
🔴 → 立即对齐 |
| 9 | refs爆仓 | references/ 文件数 > 15 → 合并候选 | 🟡 → 合并建议 |
| 10 | 测试覆盖 | 关键技能(production/critical)无 evals.json | 🔴 → 创建提醒 |
| 11 | 全链一致 | 脚本元数据 合集:{名称} 覆盖率 |
🟡 → 漏标报告 |
| 12 | skills生态 | ~/.workbuddy/skills/ 全部技能行数一览 |
💡 → 趋势报告 |
扫描项4补充说明(死引用 / 断链 / 孤儿)
三类检测,一网打尽:
- 断链(🔴):用正则从 SKILL.md 提取所有
references/xxx、assets/xxx、scripts/xxx、<SKILL_DIR>/scripts/xxx相对路径 → 逐一验证文件是否存在。不存在 = 硬断链,必须修(今天 R1 改人话引用不存在的finalize_version.py、R2 口播变文章scripts/verify_article.py相对路径错误均属此类)。 - 30天未Read(🟡):references/ 文件 30 天内未被任何会话 Read → 疑似失效引用,提示核对。
- 孤儿文件(🟢):遍历技能目录下全部
.md/.html/.py(含 assets/、scripts/),若某文件未被 SKILL.md 任何位置引用 → 零引用孤儿,建议清理或确认是否需要接入工作流(今天assets/下 3 个 HTML 模板即此类)。
扫描项6补充说明(引用存在性校验)🔴
检查逻辑:
1. 提取脚本路径模式:python\s+(\S+\.py)、scripts/(\S+\.py)、<SKILL_DIR>/scripts/(\S+\.py) → 拼接技能目录验证文件存在。
2. 提取相对 .md 路径:references/(\S+\.md)、行内 (\S+\.md)(非 http)→ 验证存在。
3. 提取疑似 DB 表名:(stats_\w+|beike_\w+|guanshi_\w+) → 🟡 列出,提示人工/自动核对(不强制连库,避免过度工程)。
4. 脚本或 .md 不存在 → 🔴 报「引用不存在:{路径}」。
扫描项8补充说明(版本一致)🔒
触发时机:每次 Edit/Write 任何 SKILL.md 后,或每月定时巡检时。
检查逻辑:
1. 依赖地图同步:读取 _DEPENDENCY_MAP.md 的「版本兼容性」表 → 对每个技能名 Read 其 SKILL.md frontmatter version 字段 → 不一致 🔴 立即同步;引用了不存在的技能 🔴 清除该行;新技能未登记 🟡 提醒补充。
2. SKILL 内部三处自洽 🔴(今天 R7 根因):同一 SKILL.md 内——
- frontmatter version: "X.Y"
- H1 标题中的 (vX.Y) 或 vX.Y
- 版本记录表「| vX.Y | ... |」中最大版本行
- 三者应一致;任一不一致 → 🔴 立即对齐(例:口播变文章曾出现 frontmatter 2.2 / H1 v2.0 / 版本记录 max v2.1 三处断裂)。
铁律:修改任何 SKILL ≥5行时,Agent 必须在同一回合内检查并同步 _DEPENDENCY_MAP.md。不得延迟到下一会话。
输出格式
## Skill 健康报告 · YYYY-MM-DD
| Skill | 行数 | 增长比 | 🔒密度 | 断链 | 孤儿 | 引用存在性 | 版本自洽 | 依赖同步 | 评分 |
|-------|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| 创作链路(小张哥说房) | XXX | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | A |
| 君启-口播变文章 | 605 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | C |
| Skill健康检查 | 52 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | A |
### 🔴 需处理(0项)
(无)
### 🟡 关注(0项)
(无)
### 🟢 可选清理(0项)
(无)
示例(Few-Shot)
例1 · 标准正向(月度巡检)
> 触发:每月 1 日 9:00 定时。
> 执行:扫 ~/.workbuddy/skills/ 全部 SKILL.md → 输出「Skill 健康报告」表格 → 全部 A/B → 静默通过。
例2 · 边界(超标告警)
> 某 SKILL.md >500 行 → 🔴 需处理:出瘦身方案。
> 🔒标记数 / 总行数 > 5% → 🟡 关注:铁律通胀审查建议。
> _DEPENDENCY_MAP.md 版本与实际 frontmatter 不一致 → 🔴 立即同步。
例3 · 断链/孤儿抓到(真实场景)
> 君启-改人话 SKILL.md 引用 finalize_version.py,但文件不存在 → 🔴 报「引用不存在:finalize_version.py」(今天 R1)。
> 君启-公众号头条排板(改名前 article-format-lz)assets/ 下 3 个 HTML 模板零引用 → 🟢 报孤儿文件,建议清理(今天已删)。
例4 · 版本自洽断裂(真实场景)
> 君启-口播变文章:frontmatter version: "2.2" / H1 (v2.0) / 版本记录表 max v2.1 三处不一致 → 🔴 报版本自洽断裂,立即对齐(今天 R7)。
例5 · 禁止项
> ❌ 修改任何 SKILL ≥5 行却未在同一回合同步 _DEPENDENCY_MAP.md(违反铁律)。
> ❌ 死引用(30 天未 Read)不得保留,应清理。
> ❌ SKILL.md 引用了不存在的脚本/文件却未报 🔴(今天 R1/R2 根因,v1.2 起必须捕获)。
name: Skill健康检查
slug: skill-health-check
displayName: Skill健康检查
version: 1.2.0
summary: Skill健康监督:行数监控、引用活性、铁律通胀检测
license: MIT
评分标准
| 评分 | 条件 |
|---|---|
| A | 8 项核心(行数/增长比/🔒密度/断链/孤儿/引用存在性/版本自洽/依赖同步)全 ✅,行数 < 400 |
| B | 7 项核心 ✅,行数 400-500 |
| C | 有 🟡 项,或行数 500-600 |
| D | 有 🔴 项,或行数 > 600 |
> C/D 级 → 微信速报 + 出处理方案。A/B 级 → 静默通过。
月度自动化
创建 recurring 自动化,每月 1 日 9:00 执行:扫 ~/.workbuddy/skills/ 下所有 SKILL.md,输出健康报告。任一 Skill 评分 C/D → 推微信速报。
> Skill健康检查 v1.2 自身已登记 _DEPENDENCY_MAP.md(§一 取喂矩阵 + §四 版本兼容性),满足其自建铁律。
修改后自动触发
Agent 每次 Edit/Write 任何 SKILL.md 后,在同一个回合内追加本扫描。仅在修改其他 Skill 时触发,避免递归。