# AI 助手为什么总在同一个坑里跌倒？——从 Warp 的自进化 Skill，聊到我们的技能路由

> 你纠正过 AI 一次，它当时改了，下次照犯。问题多半不在模型笨，而在你的纠正没地方存。
>
> 全文不需要前置知识。能对外讲的对照来自 2026-08 至 09 的 R1–R6：小样本、单次运行，不是统计证明。R7 只有 session 笔记，R8 尚未跑完。读过 Anthropic / Warp 那篇的人可以对上号；第一次听说 VibeSOP 的人，文末有最短安装路径。阈值、索引闸见 路由系统设计；控制流以代码为准，不要把该文 Stage 表当流程图。

## 1. 先对齐三个词：Agent、Skill、Memory

Agent（智能体）：不只是聊天，而是能自己动手干活的 AI——读代码、跑命令、改文件、提交审核。

Skill（技能）：把「某类活儿该怎么做」写成一份文件，放在工作目录里。AI 接到相关任务时自己去翻这份文件，照着做。Warp 创始人 Zach Lloyd 的定义：

> File-based skills are a way of encoding knowledge for agents without putting that knowledge directly in the prompt, as something the agent can simply look up in the course of doing its job.
> （文件形式的技能，是把知识编码给 AI、但不直接塞进提示词的一种方式——AI 干活的过程中自己去查。）

好处有两层：提示词不必越写越长；文件可以像代码一样被版本管理、被审查、被迭代。

Memory（记忆）：记下「发生过什么」——这个仓库上次哪里出过 bug、用户偏好什么格式。它由 AI 推理时自动写入，永远在变。

一句话分清：Memory 记录发生过什么，Skill 写的是应该怎么做。 很多系统把两者搅在一起，把流水账全塞进记忆，AI 越记越臃肿、越记越不知道该听哪条。

下面这张图是本文的分析框架，用来标约束从软到硬怎么升，不是 Warp 原文里的结构图：


- Memory：最软。可能被参考，也可能被忽略。
- Skill：居中。写成指令，靠模型自觉执行。说明书是建议，不是圣旨。
- Harness：最硬。流程写成代码，AI 没有跳过的权限。

Warp 和我们都同意：不要让 Agent 去改承载自己运行的代码。那一层必须由人写。

## 2. Warp 已经跑通的路

Warp 是一家做 AI 终端的公司。他们内部的代码评审 Agent，第一版提示词只能做对八成，剩下两成持续制造噪音。团队改提示词、补 AGENTS.md，都有改善，但没根治。更本质的问题是：

> 人对 AI 输出的纠正，在会话（session）结束的那一刻就消失了。

你告诉它「你建议重命名的那个变量，其实符合这个代码库的命名惯例」，它这次改了。下次开新会话，这段纠正不复存在，它接着犯。根因不在提示词写得不好，而在反馈没有去向。

Warp 的解法是两个 skill：Base（基础技能）承载工作指令；Improver（改进技能）当定时观察者，对比 Agent 当时的建议和人的回应，对 Base 提出尽量小的修改，走 GitHub 的 PR。定时侧是 GitHub Action / Oz 观察者。


规格、评审、分诊三类 Agent，每类自带这样一个改进循环（每类是 inner + improver）。

这套东西 已经 在他们的开源仓库和生产评审里跑。入口是模型从 name + description 列表里自选——在他们那个技能数量和模型强度下，这条路是通的，不是缺陷。

循环能成立，靠三件事：技能是普通文件，人能逐行看 AI 改了什么；反馈越具体越值钱；Improver 只改 skill 文件，不碰 Harness。

## 3. 技能一多，先要找对

VibeSOP 是开源的技能操作系统：发现、安装、路由、编排、评估、退役。仓库里目前是 18 个内置技能；跨助手有 6 个 adapter——自动注入完整度不一，验证过 Claude / Grok 的自动注入，其它主要是生成配置。真正动手的仍是 Claude Code、Grok、Kimi 这些 agent。我们做的是：听你一句话，选出说明书，再塞进上下文。

家里三本说明书，你记得住。装了 Superpowers、OMX、界面设计包之后，常常是几十上百本。人记不住，模型也会「感觉这题像调试」然后打开完全不对的一本。

路由要干的事很像图书管理员：

1. 你点名了（例如 `use systematic-debugging`）→ 给那本，不猜。要和技能 id 精确一致。未登记的 `/vibe-*` 是 `Unknown command`，不会当成点名。
2. 没点名 → 按这句话更像哪类工作来匹配。
3. 拿不准 → 宁可少给，也不硬塞一本错的。

找错了，模型会非常认真地走错流程。说明书是建议；找错之后，应该有权把书合上。找错并拒绝，工程还能救；找错还严格执行，才会把仓库带进沟里。

## 4. 我们怎么找：级联，可短接

路由不是一次「算个相似度」的调用。下面是简化视图。阈值、索引闸见 architecture/routing-system.md；控制流以代码为准，不要把该文 Stage 表当流程图。

这是级联，可短接，不是一次走完的四段流水线：

1. 显式点名命中 → 直接注入。
2. 早层：很短的 keyword 路径跑场景 + 索引；更长的查询早层主要跑索引。非场景命中会短接注入。
3. 场景命中不会直接交卷，会强制 LLM 分诊：分诊赢 → 注入；分诊没有可用结果 → 场景回退注入。
4. 以上都没有可用结果，才走匹配器聚合（仅兜底）。终端态是 no-match 或 fallback-llm。

不是「精确匹配失败就语义，语义失败就结束」，也不是「短走场景、长走 LLM、两边最后都进匹配器」。

三个设计决策：

1. 「找不到」是正常输出，不是 bug。 点名直接命中，不猜。置信度不够就不要硬塞——错的说明书比没有更糟。
2. no-match 不注入技能正文。 仍可能有一条系统消息 `No matching skill found`。生产记账是盐哈希 miss 计数 + 限流 pending。评测集里的「期望 / 实际 / 出错层」是打分字段，不是产品日志格式。
3. 注入的是 `SKILL.md` 正文，不是摘要。 匹配后把文件塞进上下文，至多约 3000 字符，超长截断，并命令 agent 再去读原文件。

## 5. 怎么验证：硬门、软口径、实验观察分开写

不要把测试覆盖率、评测集分数、徽章和建议门禁画成同一张闸。就技能效果而言，能让 CI job 红灯的是下面这一行。

| 机制 | 口径 | 类型 | 实际挡住什么 |
|---|---|---|---|
| hermetic 路由指纹 | 34 条金标；当前基线得分 30/34 = 88%（不是 fail_under 数字门槛）。embedding 与 AI triage 关闭。改 `SKILL.md` 内容哈希变了必须 `--update-baseline`。CI job Routing Benchmark (gate) 跑 `--hermetic --check`：STALE 或新的 top-1 失败会红；known-fail 保持失败仍通过 | 硬门 | 改一句话导致 keyword/explicit 路由静默翻盘 |
| 影子验证 | `vibe skill promote` 之后贴 PASS / WARN 徽章；测的是 trigger 召回，不是内容质量；永不阻断激活 | 软口径 | 给人看「这次召回如何」，不是上岗许可 |
| R1–R6 对照 | 小样本、单次运行；R7 仅 session 笔记，R8 未完成；见第 6、7 节 | 实验观察 | 不能当平均提升，也不能当 CI 契约 |

人能审出「这句话写得对不对」，审不出「这句话会不会改掉 hermetic 那 34 条的 top-1」。所以内容变了，基线必须重验。它锁的是指纹 + 逐条 ok1，不是「语义层已经过关」——语义层在这道门里是关掉的。

覆盖率 fail_under=73、lint、Windows 测试、security 也会让 CI 红，但测的是 Python 代码，不进这张表，也不要和 88% 当成一对 KPI。

## 6. 一次失败观察：27B 没有去读文件

R6 不是路由管线的起源，也不是「file-based skill 必须先有入口」的定理。失败发生在已经存在的 `vibe route` 上。

设置：编码模型和路由模型都换成参数量 27B 的小模型（处理组的 `vibe route` 也是这个 27B）。观察：

| 观察项 | 结果 |
|---|---|
| 路由判断 | 2 次路由调用全部 no-match（n=1 任务） |
| 技能文件读取次数 | 0 次 |
| 技能内容是否进入上下文 | 从未进入 |
| 反而赢了的方案 | 静态脚手架（预先把结构固定注入） |

小样本、单次运行，并且有协议偏离。不能用来宣传「技能对弱模型有效」，也不能写成「所以我们发明了分层管线」。它只说明一件更窄的事：那一轮里，知识在文件里躺着，模型没去查。

没读到 `SKILL.md` 的对照，一律不能用来宣传技能有效。

## 7. 对照里能讲的、还不能讲的

按时间顺序，能对外讲的只有方向，没有「平均提升百分之几」。

题目太简单，或写得太满：经常打平。 待办、能点的网页、接口和数据都写死的题，今天的强模型自己就会。有没有说明书，两边都能交卷。这不是技能没用，是对照测错了变量。

R7（量化驾驶舱）：题目写满。 session 笔记：两组都能跑，栈接近；有技能组多了计划、测试、文档；成品打分评委分裂，不能写成一次结算胜利。没有入库报告。

R8（量化平台）：尚未跑完。 预注册未入库。这里不结算，也不把任何口号当成这一轮的发现。

R6 是「没找着书」（no-match、0 次读取），不能拿来证明「找错比没找更伤」。找错并严格执行会把仓库带进沟——这是第 3 节的产品约束，不是某一轮对照的统计结论。

## 8. 两条学习环，以及我们没有的那块

Warp 靠显式人类反馈：有人点踩、写下那句具体纠正，Improver 去改已经存在的技能。

我们没有对等的 Improver。晋升只做新增；旧技能怎么改，目前靠人。这是缺口，不是规划。

能自动转的，是两条不要焊在一起的环：

环 1：序列候选（SequencePattern → instinct）

反复出现的工具序列，达到 ≥5 次、成功率 ≥80%、且 ≥3 步 只是候选门，本身不抬路由分。要变成 instinct，还得跑 `vibe instinct auto-promote`（默认门槛 0.85，所以 80%–84.9% 当得了候选仍升不上去）。这是命令，不是热路径自动升。habit 是另一条「会话里 query→技能」的路，不要和这条焊在一起。

环 2：发现晋升

聚类候选的入池门在 `vibe skill scan-candidates`：簇 size≥3 且 gold_rate≥60%。`vibe skill promote` 只给已经在池子里的 id 写草稿，默认不注入；不稳定候选也可以被 promote。

收窄后的 Memory 边界就这一句：聚类候选不会自动变成 `SKILL.md` 注入。 已经晋升的 instinct 才可能改路由分数。

日常要让它少抽错，仍然是三件土办法，比再写一百本说明书更值：

- 点名。 审查、调试，直接说出来，或写出完整技能 id（例如 `use systematic-debugging`）。点名最高优先，不经过猜测。
- 纠正。 找错了就说「这次不该用那本，该用界面设计」。
- 少而精。 先装真会用的包。书太多，管理员更容易抽错。

闲聊、翻译、纯问答，不该塞开发流程。

## 9. 对照：Warp 有、我们无

两者不是替代关系。Warp 已经在自己的仓库和生产里跑自进化循环。下表只列机制差异，不暗示谁是谁的前提。

| 维度 | Warp 自进化 | VibeSOP |
|---|---|---|
| 反馈从哪来 | 人给：点赞点踩 + 文字纠正 | 系统采：运行痕迹、成功率 |
| 自动修订既有技能 | 有：Improver 提最小修改，走 PR | 无：晋升只做新增，旧技能靠人工改 |
| 入口 | 模型从 name + description 列表自选 | 级联可短接；匹配器仅兜底；终端态是 no-match 或 fallback-llm |
| 变更通道 | Git PR | 候选状态机 + hermetic 指纹门（改 `SKILL.md` 必须重刷基线） |
| 注入 | Agent 按需去查技能文件 | 匹配后塞 `SKILL.md`，至多约 3000 字符截断，并命令再读原文件 |
| 作用范围 | 单仓库的规格 / 评审 / 分诊循环 | 项目级技能库；6 个 adapter，自动注入完整度不一 |
| 绝不自动改 | Harness | Harness |

## 10. 我们不声称什么

- 不让 Agent 改运行时。反复被违反又验证关键的规则，正确归宿是人写成代码，不进自动循环。
- 路由不把「不够像」硬塞成命中。置信度不够就 no-match，或落到 fallback-llm。
- 聚类结果不会自动变成技能文件。habit / instinct 可以 boost 分数，那是另一条路。
- 不说「装了技能，成品一定更好」。强模型 + 写满的题目，经常打平。
- 不说没读到说明书的对照证明了技能有效。
- 不说影子徽章是上岗门。灯不是闸。
- 不说 Warp 缺了我们才能跑。他们已经在跑。

## 11. 最短怎么用

```bash
# 1. 安装
pipx install vibesop    # 或: uv tool install vibesop

# 2. 向导：选助手、装推荐技能包
vibe quickstart

# 3. 接到正在用的助手（择一）
vibe build grok-build --output ~/.grok
# vibe build claude-code --output ~/.claude

# 4. 看环境是否健康
vibe doctor

# 5. 重启助手后正常说话即可。想手动试路由：
vibe route "帮我把这个页面做好看一点"
vibe skills list
```

装好 hook 之后，你对 Grok / Claude 说的每一句会先经过路由。点名也可以：`/vibe-help` 看有哪些入口。没有 API Key 也能用关键词 / 场景匹配做演示。

## 诚实的边界

- 对照是小样本、单次运行，不是统计证明。
- 强模型 + 写满的题目，有没有技能，成品经常打平。价值出现在：方法有讲究、题目有留白、而且找对了那一类说明书。
- 没读到 `SKILL.md` 的对照，不能用来宣传技能有效。
- 找错并严格执行会把仓库带进沟——这是产品约束，不是某一轮对照的统计结论。
- 验证过 Claude / Grok 上的自动注入；其它助手目前主要是生成配置。
- 阈值、索引闸见 routing-system.md；控制流以代码为准。

只记住三句：技能是说明书，路由是图书管理员。管理员抽错书，工匠会把房子盖歪。VibeSOP 要做的，是让说明书跟你走、抽得更准、错了由人改、用过能留痕。

## 相关阅读

- Anthropic 官方博客：How Warp builds self-improving agents on Claude
  https://claude.com/blog/how-warp-builds-self-improving-agents-on-claude
- Anthropic Webinar：How Warp builds self-improving agents on Claude
  https://www.anthropic.com/webinars/how-warp-builds-self-improving-agents-on-claude
- LanLance 推文《读懂 Warp 的 Agent Skill 自进化机制》（本文 Warp 部分的主要转述来源）
  https://x.com/LanLance24/status/2094777203984896418
- 路由实现：architecture/routing-system.md
- 上手：QUICKSTART_USERS.md
- 实验记录：仓库 `.omx/artifacts/ab-validation-wechat-deepdive.md`（R1–R6）、`ab-jet-weak-report-r6.md`（R6 协议偏离）。R7 见 memory/session.md 笔记，没有入库报告；R8 尚未完成。
- 项目仓库：https://github.com/nehcuh/vibesop-py
