技能协同风险审计与配套推荐
这个 Skill 做什么
评估多个本地单元(Skill / 专家)一起协同执行时的规则冲突与推理漂移风险,用固定量表打分,按"最高单项风险优先"判定等级,输出标准化审计报告,最后检索技能池给出配套推荐与不推荐清单。
审计对象是协同运行的整体稳定性,不是业务结果对错。本 Skill 只出报告,不执行业务任务,不修改被审计单元。
何时使用
用户在对话中指定 2 个及以上单元,并说明本次协同要完成的业务目标时使用。
不使用时:
- 只涉及 1 个单元:提示本工具用于多单元协同评估,要求补足到 2 个及以上后停止
- 用户没给业务目标:只追问业务目标,不启动审计
- 用户要的是"帮我写稿/做表/改文件":直接按用户要求处理,本 Skill 不介入
硬性约束
- 用户只提供单元名称或路径,禁止要求用户粘贴提示词、SOP 原文。单元定义一律从本地文件读取。
- 只读取用户点名的单元。
~/.workbuddy/skills/与~/.workbuddy/plugins/是该单元定义的可能存放位置,不是扫描目标;未经用户点名的单元一律不读取,不列目录、不做全库检索、不主动发现用户有哪些单元。 - 只输出审计报告。不执行业务任务,不修改、不移动、不删除被审计单元的任何文件。
- 不编造风险。检测不到的风险项记 0,不计入总分,不出现在已识别清单中。
- 判定顺序固定:最高单项风险校验优先于总分分级,最终等级取两者中更高者。不得调换。
- 单元内部若存在对子 Skill、子专家、外部工具的调用声明,必须标注为黑盒嵌套风险。
- 分数计算一律调用
scripts/score_risk.py,不手算,避免算术漂移。
执行流程
第 1 步:确认输入
逐项确认,缺项时按顺序追问,一次只问一个问题:
- 单元清单:用户指定的单元名称或路径。少于 2 个时提示边界并停止。
- 业务目标:本次协同要完成什么(一句话)。缺失时只追问此项,不启动审计。
两项齐备后进入第 2 步。
第 2 步:定位并读取单元定义
按 references/unit-reading.md 的方法,只定位用户点名的每个单元并读取其提示词、SOP、内置调用规则与输出约束。
定位失败时:如实记入报告的"参与协同单元"栏并标注"未能读取,未纳入审计",不用推断内容顶替。若可用单元不足 2 个,停止审计并说明原因。
不越过用户点名范围:不列目录、不扫描全部已安装单元、不向用户报告"你还有哪些单元可用"。
第 3 步:逐条风险检测
加载 references/risk-catalog.md,对 18 项风险逐条检测。每项记录:
- 是否检出(检出 / 未检出)
- 检出时的直接证据(单元名 + 定义中的原文片段或行为描述)
- P 值与 S 值(取自 catalog,不自行改动)
- 单项分值 = P × S
检测方法:把各单元的定义并排比对,寻找互相矛盾、互相覆盖、无法同时满足的规则。没有可比对矛盾时记为未检出,不为了凑分硬判。
第 4 步:调用脚本算分
把检出项写入临时 JSON 交给脚本:
python scripts/score_risk.py --input <detected.json> --format markdown
detected.json 格式见 scripts/score_risk.py 头部说明,结构为检出项的风险编号列表。
脚本输出:原始总分、标准化综合得分(保留 2 位小数)、最高单项校验结论、总分等级、最终等级。
不要绕过脚本手算。 脚本不可运行时按 references/report-template.md 的手算规则逐项复核,并在报告中标注"脚本未执行,分数为手工复核"。
第 5 步:获取配套技能推荐
调用 find-skills,检索与本业务目标匹配的候选技能。
- 检索可用:按
references/report-template.md的第四节要求,逐项给出推荐理由与潜在风险;同时列出业务相关但存在冲突或高漂移风险的不推荐技能及原因。 - 检索不可用:第四节、第五节降级为基于风险冲突主表的结构化建议,并在报告开头标注"未检索技能池,推荐为规则推定"。
第 6 步:输出报告
严格按 references/report-template.md 的五节模板输出。完成标准:
- 五节齐全,顺序不变
- 已识别风险清单按单项分值降序排列
- 得分保留 2 位小数
- 致命风险校验栏明确写出"未检出"或具体命中项
- 最终等级栏说明合并判定过程
- 黑盒嵌套风险单独在第二节说明
质量自查清单
交付报告前逐项核对:
- [ ] 单元数 ≥2,且每个单元的读取状态已如实标注
- [ ] 业务目标已记录,且来自用户原话
- [ ] 18 项风险全部走查过,未检出的未计入总分
- [ ] 每条已识别风险都有具体证据,不是泛泛描述
- [ ] 分数由脚本产生,或已标注手工复核
- [ ] 判定顺序为"单项锁定 → 总分等级 → 取更高者"
- [ ] 任一单项 20 分时已直接锁定高风险并停止总分分级
- [ ] 黑盒嵌套风险已检查子调用声明
- [ ] 推荐清单含理由与潜在风险两项
- [ ] 报告未包含任何业务任务的实际执行
停止条件
命中任一条件时停止,不继续输出后续章节:
- 可用单元不足 2 个
- 业务目标缺失且用户未在追问后提供
- 无法读取任何单元定义
- 用户要求的是执行具体业务任务,而非协同评估
停止时说明具体原因和补齐所需的最小信息。
依赖与降级
| 依赖 | 类型 | 必需 | 支撑功能 | 环境检查 | 降级 |
|---|---|---|---|---|---|
| 本地文件系统读取权限 | permission | 是 | 读取单元定义 | 能否列出 ~/.workbuddy/skills/ |
无可靠降级;不能读取时停止审计 |
| Python 3.10+ | runtime | 否 | 确定性算分 | python --version |
按 references/report-template.md 手算并标注 |
| find-skills 技能池 | skill | 否 | 配套技能检索 | 技能是否可用 | 降级为规则推定的结构化建议并标注"未检索技能池" |
环境检查
进入第 1 步前检查一次,只读,不修改任何配置:
- 能否列出
~/.workbuddy/skills/与其下子目录 - Python 是否可用及其版本
- 结果为 ready:直接执行
- 结果为 partial:核心流程继续,在报告中标注降级范围与限制
- 结果为 needs_setup / unavailable:只说明受影响功能,核心的读取与检测仍继续
功能降级矩阵
| 功能 | 失败条件 | 降级方式 | 限制标注 | 停止条件 |
|---|---|---|---|---|
| 读取单元定义 | 路径不存在或无权限 | 标注"未能读取,未纳入审计" | 明确该单元未参与检测 | 可用单元不足 2 个 |
| 确定性算分 | Python 不可用或脚本报错 | 按手算规则逐项复核 | "脚本未执行,分数为手工复核" | 无法确定检出项的 P、S 值 |
| 配套技能检索 | 技能池不可用 | 基于风险主表的规则推定建议 | "未检索技能池,推荐为规则推定" | 不需要停止,报告继续输出 |
| 黑盒嵌套识别 | 单元定义未声明子调用 | 按未见声明处理,不推断隐藏调用 | 说明该单元子调用情况未知 | 不需要停止 |
边界
本 Skill 不做的事:
- 不校验业务结果对错
- 不修改、不优化被审计单元的提示词
- 不执行任何业务任务
- 不读取用户点名范围以外的任何单元
- 不安装、不卸载、不移动任何单元
参考文件
references/risk-catalog.md:18 项风险清单、P/S 取值、分级与合并判定规则、检测指引references/unit-reading.md:本地单元定位与读取方法、读取失败处理references/report-template.md:固定五节输出模板、完整示例、手算复核规则