技能路由器
目标
选择能够推翻相关假设的最精简技能集合。不要追求表面覆盖的最大化。
路由器是一个调度层,而非审计器。确定性实现位于 scripts/router.py 中;全局关系、触发器、成本和重叠关系仅存在于 catalog/skills.yaml 中。
使用时机
- 在开始非平凡的审计或审查时。
- 当任务混合了多个领域(例如安全 + 可靠性)。
- 当需要证明某项技能被选中或被排除的理由时。
- 避免在执行昂贵工作之前发生技能爆炸。
- 组合: 调度到技能;不直接产生发现。
平凡且可逆的任务可以选择零个技能。
思维模型
将路由视为一个最小集合问题:
相关假设
↓
能够推翻它们的最小透镜
↓
缺失的验证角色(如果有)
↓
当额外的技能仅重复覆盖范围时停止
决策使用来自目录的结构化元数据:
trigger_match(触发器匹配)
+ domain_match(领域匹配)
+ risk_unlock(风险解锁)
+ required_signal(所需信号)
+ composition_bonus(组合奖励)
- overlap_penalty(重叠惩罚)
- cost_penalty(成本惩罚)
这不是机器学习。评分使决策可追溯且可重复。
技能预算
| 风险 | 正常预算 |
|---|---|
trivial 平凡的 | 0–1 |
medium 中等的 | 1–2 |
high 高的 | 2–4 |
critical 关键的 | 3–6 |
超过预算需要提供具体的新覆盖范围或确认理由。
按角色排序
generator(生成器) → investigator(调查器) → verifier(验证器) → reviewer(审查器) → researcher(研究员)
当外部不确定性是主要问题时,研究可以排在第一位。
调查流程
- 理解 — 重新表述任务和上下文;包括事实,而不仅仅是标题。
- 分类风险 —
trivial(平凡),medium(中等),high(高)或critical(关键)。 - 分类领域 — audit(审计),security(安全),reliability(可靠性),product(产品),frontend(前端)或 research(研究)。
- 读取目录 — 使用
catalog/skills.yaml;不要手动复制关系。 - 匹配触发器 — 根据词汇证据或所需信号选择候选技能。
- 应用风险下限 — 丢弃未达到
risk_floor的技能。 - 评分 — 应用领域、成本、组合和重叠因素。
- 强制预算 — 保留评分最高且边际收益最大的候选技能。
- 按角色排序 — 先提出假设,再进行调查和验证。
- 报告接近命中 — 最多三个看似合理但被排除的候选技能。
- 路由研究 — 指出是否需要
research-router。 - 验证 — 更改后执行
python3 scripts/eval.py route --router v2 --check。
要问的问题
- 任务需要推翻什么假设?
- 是否存在资金、奖励、所有权、权限或共享状态?
- 哪个技能能生成假设,哪个能确认机制?
- 这个技能是添加了一个新视角,还是仅仅重复了其他技能?
- 该技能的
risk_floor是否真正达到? - 覆盖范围的增加是否证明推理/研究成本是值得的?
- 任务需要外部来源还是可以在项目内部解决?
- 如果一个候选技能被排除,它是真正的接近命中,还是仅仅是关键词噪音?
攻击模式
路由不足
关键任务 → 一个宽泛的生成器 → 没有验证器
攻击:查找显式机制(重试、并发、所有权、部分失败),并检查是否有技能能够确认它们。
路由过度
一个匹配的词 → 所有相邻技能
攻击:移除每个技能,并询问是否丢失了任何假设或确认能力。如果没有任何改变,则该技能是冗余的。
模糊语言
UI 反馈中的“状态” ≠ 共享状态一致性
文案中的“访问” ≠ 授权
日常任务中的“研究” ≠ 完整的研究工作流
攻击:使用上下文和所需信号,而不是孤立的词语。
负面上下文
“无权限,无共享状态”
攻击:被否定的术语不应激活安全/可靠性技能。
预算压力
高风险任务的 7 个合理技能(预算上限为 4)
攻击:只保留评分最高的技能和那些添加了不同角色/视角的技能;其余的移至“接近命中”。
证据要求
当路由决策包含以下内容时,它是有依据的:
- 已分析的任务和上下文;
- 风险以及主导类别;
- 按顺序选择的技能;
- 每个选择的角色、评分和触发器/信号;
- 已使用的预算;
- 最多三个接近命中;
- 研究决策;
- 当路由被更改时的确定性评估结果。
初始门槛:
routing_precision(路由精度) >= 90%
routing_recall(路由召回率) >= 90%
critical_skill_recall(关键技能召回率) = 100%
trivial selected(平凡技能选择数) <= 1
假阳性
- 出于“安全考虑”选择所有相关技能。
- 仅因为类别匹配就提升某个技能,而没有触发器或信号。
- 将
composes_with关系视为强制依赖。 - 忽略
overlaps_with并重复相同的覆盖范围。 - 在所有情况下都将
useful技能视为强制性的。 - 将否定的上下文(
no permissions)用作正面信号。 - 列出所有被拒绝的技能;只有真正的接近命中才重要。
- 在此文件中重复目录中的全局表。
输出格式
## Skill Router — Dispatch(技能路由器 — 调度)
**Task(任务):** <任务 + 相关事实>
**Dominant category(主导类别):** <audit | security | reliability | product | frontend | research>
**Risk(风险):** <trivial | medium | high | critical>
**Budget(预算):** <最小值–最大值;已选择 N 个>
### Selected(已选择)
1. `<skill>` — role(角色):`<role>`;score(评分):`<score>`;evidence(证据):`<trigger/signal>`
2. ...
### Near misses(接近命中)
- `<skill>` — <为什么看似相关以及为什么被排除>
- 不超过 3 个
### Research routing(研究路由)
<none | proportional | full; 来源/技能(如需要)>
### Budget justification(预算理由)
<仅在超出预算时填写;否则“within budget”(在预算内)>
执行器运行所选技能并单独整合发现。路由不将假设提升为发现,也不选择置信度。