skill-review · diff
git:20260910.c41340d to git:20260910.5a23bfd
2 added, 0 removed. Audit A to A.
---
name: skill-review
description: >
对一个 skill(默认 diagnose)做**质量与体验**审视:静态审计 / 扰动实验 / 盲辨与走查 /
坏路径体验 / 注意力预算 五个视角,产出评审报告(落 proposals/reviews/)与可选改进建议。
**不做 CI 硬门**——体验是判断性规范,硬门化等于假硬化。用户显式要求"审视某个 skill 的
质量/体验""诊断用起来是不是很机械/哪里别扭"时使用。
disable-model-invocation: true
---
# 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 | 常驻部分是否已超预算(常驻每轮都付) |
```bash
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 硬门 | 约定 | **只建议** |
| 触发 | 改检索/路由面时 | 改交互面时 | 用户显式要求、大改之后、深度轮 |
## 为什么需要它
正确性回归全绿,不等于用起来不别扭。机械感来自两种东西:**规则过细**(把模型挤成清单执行器)与
**规则互相打架**(两处文档写反,模型行为随机)。这两类都测不出来——它们不改变命中率,只改变体感。
专门的审视视角把它们变成可讨论、可记录、可改进的对象,而不是"感觉有点怪"。