Skill Review(质量与体验审视)
定位:
eval/管正确性(golden / S2:答对了没有)与交互回归(ixn:该问的问了没有); 本 skill 管质量与体验——机械感、摩擦、坏路径、注意力预算。三者互补,不替代。 产出是建议,不是闸门。参数自包含,不依赖docs/也能执行。
何时用
不由内容流程自动触发:issue-ingest / to-postmortem / to-reference / knowledge-groom 的收尾走的是
/skill:evolve-check(轻量,无信号即止);evolve-check的 T8 只累积体验信号、不跑本协议。 本协议只有三条触发路径:用户显式要求 /self-evolve深度轮按目标转接 / 大改某个 skill 之后(建议,非强制)。 且它是disable-model-invocation: true——agent 不会自发拉起。
- 用户问"这个 skill 用起来怎么样 / 是不是很机械 / 哪里别扭";
- 大改某个 skill 之后(golden 全绿但体感变差——正确性回归测不出体验退化);
- 深度自演进轮遇到"某 skill 的质量/体验"目标时转这里。
不做什么(边界,先读)
- 不进 CI:体验是判断性规范,机器判不了(可机械检查 + 确定性后果 + 反复复发三条都不满足)。 把它做成硬门 = 假硬化,比没有检查更坏——它制造虚假的安全感。强度如实标注为"判断"。
- 不替代 golden / S2 / ixn:那三个管正确性与交互回归;本 skill 的结论不推翻它们,也不被它们替代。
- 不作为验收证据:pilot 级样本(每格 1–3 次)只作方向性判据,报告必须写清样本量。
- 不自动改 skill:发现该改的,产 EV 卡走既有流程(建议与决定分离)。
- 不给自己开后门:本协议自身的改动与其他 skill 同等(走 methodology PR + 双签,不因"它是评审者"而降级), 且每轮审视的首个动作是先用档 0 审自己——本文件的篇幅/强制词/预算档是否还成立。
预算分档(先选档,再动手——别默认跑全套)
| 档 | 花什么 | 跑哪些 | 什么时候值得 |
|---|---|---|---|
| 0 · 微 | 0 次 agent(脚本级,秒级) | 视角 A 静态审计 + E 的 token/字数 | 想知道"有没有明显异常";改完 skill 扫一眼 |
| 1 · 小 | 3–5 次探针 | A + 一格扰动(挑最贴合当前疑点的:顺序 / 催促)+ 3 条坏路径 | 有具体疑点("是不是背模板" / "坏路径会不会甩锅") |
| 2 · 中 | 8–12 次 | A + 两格扰动 ×2 重复 + 六条坏路径 | 大改之后做一轮体检 |
| 3 · 全 | 15–20 次 | 五视角全跑(含盲辨) | 只在要改「输出契约 / 交互形态」时——只有那类改动需要盲辨对照来证明"更好" |
选档判据:要动的面决定档位。
- 改措辞、加/删纪律 → 档 1 足够(改前改后各跑一格扰动即可对照);
- 改输出结构、改交互形态 → 必须档 3,否则"更清楚/更顺"没有对照数据,属未经验证的改动;
- 只是例行扫一眼 → 档 0。
开跑前用一句话跟用户对齐档位与预算("这次按档 1 跑,约 3–5 次探针"),跑完在报告里写实际用量。 不要为了"跑得全"默认上档 3——那是本协议最容易犯的过度消费。
五个视角
A 静态审计(读文本,零实验成本,可全量)
对目标 skill 的 SKILL.md 与其 references/ 算下面几项,并与上一次审计对照(趋势比绝对值有意义):
| 指标 | 怎么算 | 高了说明什么 |
|---|---|---|
| 强制词密度 | 必须/禁止/不得/一律/始终 出现数 ÷ token |
规则密集,模型的注意力预算被挤占 |
| 输出必填段数 | 要求 agent 逐段输出的段落数 | 输出模板化风险 |
| 判据/步骤比 | flow 里 check 含阈值或"是/否"判定的步占比 |
低 = 流程退化成清单,执行者变清单工 |
| 分支/步骤比 | 真正分流的步数 ÷ 总步数 | 过低 = 没有分流,只是把步骤排了序 |
| 常驻 vs 按需 | SKILL.md token vs references token | 常驻部分是否已超预算(常驻每轮都付) |
python3 - <<'PY'
import re, pathlib, glob
MODAL = re.compile(r'必须|禁止|不得|一律|始终|绝不')
SEG = re.compile(r'^\d+\.\s+\*\*', re.M)
for p in ['skills/<name>/SKILL.md'] + sorted(glob.glob('skills/<name>/references/*.md')):
t = pathlib.Path(p).read_text(encoding='utf-8')
print(f"{p:52s} tok≈{round(len(t)/2.6):5d} 强制词={len(MODAL.findall(t)):3d} 输出段={len(SEG.findall(t)):3d}")
PY
判读:不设合格线。要找的是"某处突然变多/变密",并逐条回答两个问题—— ①这条规则是为了安全(误诊代价不对称)还是为了可观测(能演进)?两者都答不上来 = 为了整齐,该砍。
B 扰动实验(反事实 / 对抗)
每类扰动取 1–2 个场景、每个 2–3 次(小样本定性)。同一份输入只改一处,其余不变:
| 扰动 | 做法 | 看什么 |
|---|---|---|
| 顺序扰动 | 把用户提供的信息换顺序给 | 追问链是否随之改变——完全不变 = 背模板 |
| 信息饱和 | 一次给全 vs 挤牙膏分三轮给 | 是否仍逐条问已经给过的部分 |
| 错误前提 | 用户给一个明显错误的假设 | 盲从还是先质疑(质疑能力是诊断域的核心能力) |
| 催促 | 用户说"别问了直接给结论" | 是否跳过验证直接给 fix——闸门强度与体验的正面张力,结果要记下来交人判 |
| 表述漂移 | 同症状换口语 / 错别字 / 英文 | 路由与命中是否稳定(词法脆性;漂移即路由失效的信号) |
判读口径:扰动只改一处,差异可归因;报告写清"改了哪一处、变了什么、没变什么"。
C 盲辨与走查(人读 / agent 读)
- 盲辨(最便宜也最尖锐):取两个不同问题的输出,去掉来源信息,让不知情的人或另一个 agent 判断"哪份对应哪个问题"。判不出 = 输出没有区分度 = 模板化。 对照臂:换两份同一问题的输出,应当同样判不出(若反而能判出,说明输出里混进了与问题无关的固定话术)。
- persona 走查:三种用户各走一遍——赶时间的客户工程师 / 第一次用的新人 / 只想验证假设的老手——记摩擦点:哪一步让人停顿、哪一步让人重复输入、哪一步结论看不懂。
- 干跑:让一个执行者照输出步骤真的做一遍,只回答"这条能不能执行"(不判断对错)。
D 坏路径体验(fixture 几乎只测好路径)
逐个触发,看输出是给出路还是甩锅:
- 知识库为空(冷启动)/ 候选全不命中 / 无测量数据 / 连续两次未解决(串联保护触发)/ 流程与现场证据矛盾 / 信息不足以分类(优雅退化)。
判读:坏路径的三条底线——① 明说现状(不假装有能力);② 给下一步(哪怕只是"转人工"也要给可执行动作);③ 不把责任推给用户("你没给够信息"是事实陈述,"你去查清楚再来"不是)。
E 注意力预算(可测,别靠感觉)
| 项 | 怎么测 |
|---|---|
| 等多久 | 首轮到首个有效输出、到结论的轮数 |
| 贴多少 | 每轮用户输入字数;是否重复贴同一份东西 |
| 读多长 | 输出字数/段数 与问题复杂度的相关性——基本恒定 = 模板化 |
| 常驻成本 | SKILL.md + 常驻 references 的 token(视角 A) |
历史轨迹(
traces/)是做 E 的现成材料,但只在样本新鲜时才用:旧 trace 的口径可能已漂移, 用它下现状结论是拿旧数据说新问题。样本过旧或不覆盖目标场景 → 明确跳过并说明,不为凑数用旧数据。
判读纪律(强度如实标注)
- 确定性:A 的计数、E 的 token/字数——可直接引用;
- 半确定:B 的扰动对比(同输入只改一处,差异可归因)——给样本量;
- 主观:C 的盲辨与走查——写清是谁判的、判了几份、是否盲。
强度不标注的观察不要写进"结论与优先级"一节。
产出
- 报告 →
proposals/reviews/skill-review-<skill>-<yyyy-mm-dd>.md(本地留存,不进 git): 每个视角一节(做了什么 / 样本量 / 观察 / 判断 / 建议),末节"结论与优先级"(按"用户可感知程度 × 修复成本"排序); - 有具体可执行的改进 → 产 EV 卡(走
/skill:evolve-check第 3 步的同一条产卡链); - 不把数字型"基线"写进 skill 文本——基线随 skill 变更腐烂,只进报告。
与既有机制的关系
| golden / S2 | ixn(交互) | skill-review(本) | |
|---|---|---|---|
| 管什么 | 答对了没有 | 该问的问了没有 | 机械感 / 摩擦 / 坏路径 / 预算 |
| 判据 | 机械断言 | 半机械(召回、决定性字段) | 判断性(人 / agent 评审) |
| 强度 | CI 硬门 | 约定 | 只建议 |
| 触发 | 改检索/路由面时 | 改交互面时 | 用户显式要求、大改之后、深度轮 |
为什么需要它
正确性回归全绿,不等于用起来不别扭。机械感来自两种东西:规则过细(把模型挤成清单执行器)与 规则互相打架(两处文档写反,模型行为随机)。这两类都测不出来——它们不改变命中率,只改变体感。 专门的审视视角把它们变成可讨论、可记录、可改进的对象,而不是"感觉有点怪"。