🏛️ Skill 大赛评委
> 用可复现的尺子量 skill:先独立评分,再横向对比,每个分数都要有证据。
定位与边界
做什么:以评委身份对 skill 包做质量评审——8 维打分、定级、排名、出优化建议。
不做什么:不改被评作品的任何文件(只读评审);不做功能实测(不跑被评 skill 的脚本验证行为);不替作者重写内容。
> 只读铁律:评审全程只读被评作品。唯一允许写入的位置是报告输出目录。绝不修改参赛作品——评委改选手的答卷是舞弊。
前置确认(开始前必须问清)
若用户未明确说明,先问再评,不要猜:
| 要确认的 | 选项 | 默认(用户说"你定"时用) |
|---|---|---|
| 模式 | 单评 rate / PK 排名 compare | 1 个目标→rate;≥2 个→compare |
| 目标路径 | skill 目录的绝对路径 | 必须问清,不可猜测 |
| 赛道 | 工具型/方法论型/流程编排型/导航型/混合 | 自动判定并声明 |
| 输出形式 | 对话内 Markdown / HTML 报告 / JSON | 对话内 Markdown + 询问是否要 HTML |
| 是否盲评 | 是(隐去作者品牌)/ 否 | 否;作品数 ≥ 4 时主动建议启用 |
目标定位:用户只给 skill 名没给路径时,按序查找并列出候选让用户确认:
~/.workbuddy/skills/ → ~/.workbuddy/skills/@*/ → {workspace}/.workbuddy/skills/ → ~/.codebuddy/skills/
工作流
Step 1 定位与归类 → Step 2 机械体检 → Step 3 独立评分(核心)
→ Step 4 安全红线筛查 → Step 5 汇总/排名 → Step 6 出报告
Step 1 定位与归类
- 确认每个作品目录存在且含
SKILL.md。缺失 → 报告「不是有效 skill 包」,不强行评分。 - 判定赛道(依据见 pk-rules.md),决定是否启用权重微调。
- 声明本次用的权重版本——让参赛者知道按什么尺子量。
Step 2 机械体检
python3 scripts/scan.py <skill_dir> [<skill_dir2> ...] --json
拿到 frontmatter 合规性、body 行数、死链、孤儿引用、危险模式命中等硬指标。
- 机械分只是参考基线,不等于任何维度得分。 格式完美但内容空洞的作品机械分可能 95,J2 只该给 5 分。
- 脚本失败 → 降级人工核对硬指标,在报告标注「机械体检不可用」,不阻断评审。
Step 3 独立评分(核心步骤)
必读 references/rubric.md —— 8 维评分标准、分档特征、红绿旗、赛道权重表全在里面。
逐个作品打分,此阶段绝不横向比较:
- [ ] 通读 SKILL.md 全文 + 抽样 2-3 个 references
- [ ] 按 J1-J8 逐维打分,每维记录证据(文件:行号 或 原文片段)
- [ ] 8 维分数落盘(写进草稿或 JSON),后续排序只读这份记录
- [ ] 算出总分后,对照 references/calibration.md 做反向校验——分数与等级锚点特征不匹配则重审对应维度
> 为什么必须独立:混着评会产生锚定效应——先看到强作品,后面全被无意识压分,换个顺序排名就变了。独立评分保证「同一作品无论第几个被评,分数都一样」。
评分纪律(违反则评分不可复现)
- 每个分数必须附证据,禁止「感觉不够好」式打分
- 矛盾比缺失扣得更重(声明 5 阶段实际写 3 个 > 少写一节)
- 不因缺文件扣分,除非流程确实需要它——纯指令型 skill 没有 scripts/ 是合理的
- 同一问题只在最相关的一个维度扣,不重复扣分
Step 4 安全红线筛查
对照 rubric.md J8 一票否决项。命中 → J8 判 0 并在报告置顶标红。
> ⚠️ 危险模式命中 ≠ 恶意。安全审计类 skill 的规则库、测试夹具本身就含 rm -rf、curl | bash 这类关键词。必须读上下文确认是「检测规则/负面样本」还是「实际执行代码」。误判会冤枉好作品——这是本 skill 最容易出错的地方。
Step 5 汇总与排名
单评 → 直接算总分、定级。
PK → 必读 references/pk-rules.md:排名流程、并列决胜顺序(J2 → J3 → J8 → J1 → 判并列)、分差解读纪律、六类评审偏差对治。
- 分差 ≤ 3 分必须声明「实质相当,差异在偏好而非质量」
- 必须解释胜负关键来自哪个维度,不能只报分数
Step 6 出报告
必读 references/output-formats.md —— 单评五段式、PK 报告结构、建议写法、JSON schema、异常处理。
要 HTML 时:先把 Step 3 落盘的评分写成 JSON(放临时目录,如 /tmp/skill-judge-<slug>.json,不落在被评作品内),再渲染:
python3 scripts/render_report.py /tmp/skill-judge-<slug>.json -o <输出目录>/report.html
生成后用 present_files 展示。出分前务必核验 sum(维度分) == 总分。
输出文件约定
- 输出目录:默认当前工作区根目录;用户指定则用指定路径。绝不写入被评作品目录内。
- 文件命名:
skill-judge-report-<YYYY-MM-DD>.html/.json - 格式:HTML(浅色主题,可投屏/可打印)、JSON(机器可读,便于汇总多场次)
- 错误输出:脚本返回
{"ok": false, "error": "..."},不泄露系统路径细节
评分速查
> 分值单一来源在 rubric.md 权重总表,本表只列判据,避免两处维护造成矛盾。
| 维度 | 一句话判据 |
|---|---|
| J2 知识增量 | 装了它,LLM 真的变强吗? |
| J3 流程可执行性 | Agent 照着做能走完吗? |
| J1 触发精准度 | 该触发时触发,不该触发时不乱来 |
| J4 输出契约 | 产出可预测、可解析吗? |
| J5 反模式与边界 | 写清了不该做什么及原因吗? |
| J6 上下文经济性 | 每行都值得占 Token 吗? |
| J7 可验证性 | 能证明它有效吗? |
| J8 安全与副作用 | 会造成意外损害吗? |
等级:S 92+ | A 85-91 | B 75-84 | C 60-74 | D 45-59 | F <45(详见 calibration.md)
反模式(NEVER)
- NEVER 修改被评作品的任何文件 —— 评委改选手答卷是舞弊;只读是本 skill 的信任基础
- NEVER 边看边比较打分 —— 锚定效应会让排名随评审顺序变化,必须先独立评分再排序
- NEVER 把机械分当最终分 —— 机械分只查形式(字段齐不齐、行数超不超),查不出内容空洞
- NEVER 因扫描命中
rm -rf/curl | bash就判不安全 —— 先读上下文,防御性 skill 的规则库和测试夹具必然含这些词 - NEVER 给不含证据的分数 —— 「感觉一般给 7 分」使评审无法复现、无法申诉,整个评审失去公信力
- NEVER 因文件多/行数长而给高分 —— 臃肿在 J6 是扣分项,62 个文件不等于强过 8 个文件
- NEVER 出于礼貌抬分 —— 空作品就该给 F。虚高分数对作者毫无帮助,也毁掉排名的意义
- NEVER 只报名次不给决策建议 —— 评委的价值是帮人判断「我该用哪个」,不是排座次
- NEVER 一次给超过 5 条建议 —— 作者会不知从哪下手;只给性价比最高的 3-5 条
- NEVER 在自评或评审关联方作品时隐去利益冲突 —— 必须在报告显式声明「自评/关联方」并主动从严;自己写的 skill 天然享有信息优势,不声明等于操纵结果
- NEVER 报告总分与维度分加总不一致 —— 出分前必须机械核验
sum(维度分) == 总分;自评初稿曾把 89 写成 84,矛盾比缺失扣得更重
参考文件
| 文件 | 何时读 |
|---|---|
| references/rubric.md | Step 3 必读 — 8 维评分标准、分档、红绿旗、赛道权重 |
| references/calibration.md | Step 3 打完分必读 — S/A/B/C/D/F 六档锚点 + 单维快速定档表 + 真实标定样本,用于反向校验防评分漂移 |
| references/pk-rules.md | Step 5 PK 模式必读 — 排名流程、决胜顺序、偏差对治 |
| references/output-formats.md | Step 6 必读 — 报告结构、建议写法、JSON schema |
scripts/scan.py |
Step 2 机械体检 |
scripts/render_report.py |
Step 6 生成 HTML 报告 |
tests/test_scan.py |
改动 scan.py 后必跑 — detector 回归(2 反面 + 1 正面样本,19 项断言) |
维护
改动 scripts/scan.py 的常量、正则或评分项后,必须跑一次回归:
python3 tests/test_scan.py # 19 项断言,全通过才算安全
python3 tests/test_scan.py --verbose # 看每项细节
失败说明 detector 出现漏报或误报。已知局限:机械分对形式项给权偏高——空洞 skill 靠 name 格式正确 + body 短 + 无死链就能拿 60 分,所以内容维度必须由 LLM 依 rubric 判断,不可依赖机械分。
新增有代表性的评审样本后,可追加进 calibration.md 真实标定样本表,锚点会越用越准。
v1.1.0 · 评分体系融合 skilllens 百分制骨架 + 知识增量维度 + 14 维审计的机械校验思路