当生产免费,唯一稀缺的是判断
3 个仓库,129 条规范,一个压测项目。 结论:最值钱的不是collaboration那 129 条正文,而是 十几条判据 和一套 会否定自己的机制。
⏱ 文中数字是写作时(2026-09-26)的快照,它们会腐烂。 要当前值:
collab validate(全部条目)·collab catalog(在路由里的)·npx vitest run(测试数)。 本文自己就抓到过这个病 —— 初稿有三个版本,三处数字各自腐烂(详见第四节判据 C′)。
起因:我不是想写规范,是想让 AI 别忘事
一开始只是个小麻烦:让对话式 AI 解释代码时,它有时会忘记约定的输出格式,或者漏掉我特意交代的规矩。
后来试了个笨办法 —— 把大佬们沉淀下来的 workflows / skills 直接喂给它。有效果。
更有意思的是:它在解读代码时,偶尔会冒出一些我自己没想到的判断(不是知识,而是"怎么判断")。
于是就冒出一个念头:能不能不靠我手工搬运,让 AI 自己把这些有用的做法吸进去、总结出来、再迭代?
但真要动手,先要回答一个更根本的问题:什么东西值得留下、什么东西该被删掉 —— 凭什么?
这个仓库和这篇文,都是那个念头跑出来的副产品。三个仓库的分工:
| 仓库 | 它是什么 | 在本文里的角色 |
|---|---|---|
| collaboration | 知识库本体(条目 + 两本账本 + 门禁) | 主角 |
| collab-cli | 工具链(validate / catalog / retire / MCP) | 把"判断"变成会被执行的机器 |
| evolutionary | 真实业务项目(换电平台演练;链接指向其中一条功能分支) | 试验场:本文所有"拦截"都发生在这里 |
以下是它跑起来的这阵子里撞到的墙,和为了不撞第二次而长出来的机制。
一、37 个文件,35 个是空的
有一次,AI 把一批规范"落盘"了。37 个文件。第二天核对:35 个是 0 字节。
没有人发现。因为校验器是绿的 —— 它只检查"文件在不在",不检查"里面有没有东西"。
而真正完整的那一版,反而躺在一个 79KB 的单文件补丁里,不可检索、不可链接、不可删除。
这不是 AI 的错。这是环境的错:写下一条规范的成本趋近于零,而验证它、修剪它的成本没有变。
当生产免费,全部价值迁移到"选择"和"验证"。
二、我们以为在写知识,其实在建选择机制
三种生产成本,三次迁移,同一个规律:
| 生产成本趋近于零 | 价值迁移到 | 表现 |
|---|---|---|
| 写代码 | review | AI 写完 → 人读代码,review 成为瓶颈 |
| 写测试 | 规格 | 规格先行,测试是规格的形式化 |
| 写条目 | 修剪与验证 | 条目无限膨胀,信噪比归零 |
怎么让"该留下什么"这件事,不依赖人的自觉?
三、先看证据,包括对我们不利的
下面是出现过的几个问题,第二个是反证。
问题 1:n=3 的自然实验
三个仓库里,只有一个被新鲜度脚本盯着。
| 仓库 | 被仪器盯? | 状态 |
|---|---|---|
| 工具链仓 | 是 | 新鲜 |
| 知识库仓 | 否 | 落后 21 个提交 |
| 业务仓 | 否 | 根本没登记 |
100% 相关。 结论不是"这知识库有用",而是:
规则有没有用,不取决于它写得多好,取决于它接在哪里。
问题 2:唯一干净的对照实验,测出零差异
在空项目里跑双臂(有库 / 无库):代码结构无差异,读知识库那一路墙钟 +55%。
但它有边界:它测的是"模型知不知道正确答案",而不是"模型会不会被本地代码带偏"。后者的证据在下一节。
问题 3:111 个波次,知识增量为 0
我们让 agent 集群在一个真实业务项目里连续跑了 111 个波次:前端测试从 35 涨到 185,代码一路推进。
知识库的增量为 0。
去看在做什么:把已经成熟的写法,一个域一个域地铺过去。
机械应用撞不到墙。撞不到墙,就产不出新知识。 而"跑得欢"和"走得远",在仪表盘上长得一模一样。
四、可以搬走的判据
不是 129 条正文 —— 是这些。
判据 1:无机制的政策是负优化
加了规则却更慢,不是"还没优化够"。判定三问,任一答"否"就停下:
- 违反能否 60 秒内被外部观察到?
- 发现之后有强制动作吗?("记一笔"不算)
- 执行面具备吗?(工具、脚本、约束)
我们在同一个流程上从 v5 写到 v9,每版都在加条文,吞吐反而变慢。
判据存在、可观察、但没有任何东西去数它 —— 等于没有。
判据 2:给停滞装仪器,测"产出为 0",不要测"积压 > 0"
我们装过一台仪器:给"待处理候选"检查龄期,挂太久就报警。
装完跑一遍,绿的。一天后核对:那个队列里最新的记录是两天前的,中间一百多个波次,新增为零。
我假设的病是"东西堆积、没人处理"。 实际的病是"东西根本不产生"。 所以那台仪器永远不会亮 —— 它测的是一个不存在的病。
后来我们把仪器状态整理成一张表,越往下越贵:
| 状态 | 结果 |
|---|---|
| ① 没仪器 | 从未执行 |
| ② 有仪器、没接线 | 也未执行(脚本写了两天没人跑) |
| ③ 接了线、但测错了病 | 恒绿 —— 比没装更危险,因为它看起来像在监控 |
| ④ 测对了、也红了、没人接 | 仍不执行 ← 我们最近才发现这一档 |
| ⑤ 红了、且有强制动作 | 真正生效(接线当天抓出 2/3 仓已烂) |
第 ④ 态是最后才补上的:我们的工作记忆仪器当场报出 "7 个文件里 6 个需要处理",红灯亮着 8 到 9 天,而唯一的响应是"知道了一件事"。
装仪器时,要同时写响应协议:红灯出现后只允许两个动作 —— 更新它,或降级归档。"知道了但不动"不是第三个选项,它是这台仪器失效的定义。
2026-09-26 又补一种 ③ 的变体:差值型仪器要先问"同源吗"。 这台仪器的判据是"自上次对账以来有几个提交"(
git rev-list --count <基准>..HEAD)。 实测:人在 topic 分支上对账(基准ac7aa6c),之后切回更旧的main(dc3b366)—— 这个数返回 0,仪器报"新鲜"。不同源时,差值不是"零",是"没测"。
判据 3:声称需要被强制,否则静默漂移
某段代码的注释写着"同事务双写"。听起来很可靠。
而整个仓库没有一处 @Transactional。
后果不是慢,是数据错:两次写各写各的,第二次失败时第一次已经提交 —— 货被取走了,账上没有记录。而用户那侧看起来一切正常。
修它的方式不是改注释,是先写一个会红的测试证明它现在不成立,再把机制补上。
代码里有一类注释,不描述"这段在做什么",而是声称一个跨切面属性 —— 同事务、线程安全、已校验。 读到这种,先花五秒
grep一句:谁在强制它?
判据 4:核实的范围,由你的想象决定
同一个动作,连续两次不同形态的错:
- 第一次:下令"改成服务端渲染",动手时才发现后端根本没有读接口;
- 第二次:核实了生产实现,却漏了三个测试替身。
不是"没核实",是"核实的范围不够"。
为什么:
测试里出现的形态,是作者脑子里的形态。 而作者脑子里的形态,正是他误解的那部分。 所以测试通过,不是因为东西对,是因为它和你的误解一致。
五、这套东西对 agent 的用处
-
它拦的是"恭顺",不是"无知"。 这是最有价值的一条。16 条真实拦截记录里,5 条的原文写着"差点继续" —— 差点继续用字符串前缀判 HTTP 状态码、差点继续把首页写成纯客户端渲染。没有一条是"模型不知道",每一条都是"模型知道,但它照着本地已有的坏代码写下去了"。 这个区分决定生死:拦无知的规范会随模型升级变成废纸;拦恭顺的规范永远不会贬值,因为项目里永远有旧代码。
-
它给 agent 一个"可以合法地说找不到"的位置。 路由表没有 → 用关键词检索 → 还是没有 → 报告"找不到",不要凭空发明规范,并把这次检索记进"缺口账本"。结果是下一批 agent 不会在同一个地方再撞一次 —— 而"查过了、没有"和"根本没查"从此长得不一样。
-
它给发现一个落点。 业务仓记候选,通过复盘后只往知识库回填一行摘要,证据留在业务仓。没有这条,知识库会被项目日记淹死。
-
它让输出可判定。 校验器有一组结构规则(YAML、id、链接、章节、索引、生成物新鲜度、未声明目录…);新条目入库必须回答 "不读它,模型会照着本地哪个模式写错?" 答不出来就不许进。
-
多 agent 派工有了契约。 真实踩过的坑:同一棵树四个写者互相覆盖、worktree 里"找不到刚写的文件"(分支分岔,且不报错)、派出去了没有回执、小切片派工是负吞吐。现在的前置条件写成两条:基线绿 + worktree 重新基线;且先问"这一波两路会不会改同一个方法体"。
六、它对 agent 的坏处
-
上下文税。 知识库的 markdown 一共 467 KB(167 个文件,2026-09-26 实测)——全量注入是十万 token 量级,直接吃掉大半窗口。用得好是 O(log n)(读入口 + 两三条),用不好就是把窗口捐给元讨论。
-
不可自证的规则会被"表演"。 "回答从 H2 开始""不改约定"这类能自查的规则会被真遵守;"给鼓励""递归两轮"这类无法证明的,只会被表演。规则必须写成"我能自证"的形式,否则它就是 token 成本。
-
错误的权威感 —— 最隐蔽的一害。 知识库错了,agent 会更自信地错。实测:校验器报 0 问题,而我自己写进条目的一个路径根本不存在。文档腐烂不可怕,腐烂的文档被信任才可怕。
-
窄化搜索。 "路由表没有 → 报告找不到"这条规则是对的,但它有个危险的下沉版本:"库里没有 → 不做"。知识库会悄悄变成 agent 的世界边界。
-
维护成本转嫁给未来每一次会话。 每次新会话都要读入口、判新鲜度、维护两本账本。这不是免费的:实测里 7 个工作记忆文件 6 个过期,而 111 个波次中知识库产出为 0。做得好的时候它是引擎,做不好的时候它是图书馆。
七、所以值得使用吗
| 层 | 值得使用? | 理由 |
|---|---|---|
| 机制(校验器 / 两本账本 / 入库门槛 / 毕业退役 / 仪器) | ✅ | 有证据、可搬运、直接改变 agent 行为 |
| 判据(第四节四条 + 第十节那一批) | ✅ | 可以脱离本仓库独立使用 |
| 30–40 条通用工程正文 | ⚠️ 部分 | 模型自带,且会随模型升级自动变好 |
| 治理形态(CODEOWNERS / RFC / 讨论期) | ❌ | 一人规模下是空壳 —— 我们验证过,从未运行 |
判据只有一条:它是否改变 agent 在某个具体高代价场景下的行为。按这条筛,值得推广的东西不到全部内容的 10%。
八、如果你只想搬一样东西
搬两本账本,加一道门槛,加一根会亮的线。
interceptions.md 条目拦住了什么 → 决定留哪条
known-gaps.md 条目没能回答什么 → 决定补哪条
它们是一对。只有收益侧、没有缺口侧的账本,会变成一份功劳簿。
再加上那道入库门槛:
新增一条,必须能说出"不读它,模型会照着本地哪个模式写错"。说不出来,就别进库。
以及一根线:任何规则,先回答"它接在哪"。接不上的,现在别写。
九、最后
回到开头那个问题:生产变便宜之后,什么变贵了?
判断变贵了。
而判断有个特点:它不能靠"加东西"解决。 加条目、加规则、加 agent、加门禁 —— 全都在增加生产。
以上最有用的事,几乎都是减:
- 删掉一个假绿灯的检查(它
echo一行就算通过,五项校验一项没做); - 删掉一个编造的数字("边际价值增加 3-5 倍",没有任何来源);
- 改掉一条与事实相反的规则("AI 永远不持有写权限" —— 它有);
- 写一条规范,专门用来指控自己最近三个版本的负优化。
这套东西最像样的能力,是它否定自己的能力。
一个知识系统的价值,不在于它知道多少, 而在于它能不能在没有外部监督的情况下,抓住自己的错误。
十、第二轮:一次"合规表演",和它逼出来的几条判据
第一轮结束时,我们以为判据差不多齐了。第二轮就撞上一件新事。
事故:模型学会了"表演合规"
我们把多文件输出的格式要求写进了一份约定("请用 ===== FILE: <路径> ===== 分隔")。
对话式 AI 的输出是这样的:
开场白 → ```text 围栏 → 真条目 → 一张"为什么这样符合约定"的对照表 → 一句追问
它遵守了分隔符,却把整件事包了起来,还额外写了一段解释自己如何遵守的文字。
解析器按既定规则严格拒收 —— 15 条 content outside any block。
这不是模型不听话,是约定的形状不对:那份约定规定的是"分隔符长什么样", 没规定"整段输出的形状"。而模型会把"格式要求"当成它输出内容的一部分。
改成"内容自描述"之后——不再要任何人为分隔符,边界改从条目本来就有的
YAML frontmatter 里读 id / type——三种污染(围栏、开场白、合规说明表)同时消失。
判据 A:契约的形状不对时,补丁追不上。 外部输入反复以"多余包装"出现时,先问契约是不是在管包装,而不是再加一条宽容规则。
另外几条,是同一轮的具体缺陷逼出来的
| # | 判据 | 现场 |
|---|---|---|
| B | "跳过"必须配"出声";成功路径也要能带 warning | Result<T, E> 表达不了"成功但有警告",于是"宽容"必然退化成"静默丢弃" |
| C | 能派生的别手写 | 同一形状当场抓到五次:章节清单 / help 选项 / 目录清单(少了一个)/ 版本号 / 标题位规则 |
| C′ | 同一内容写两处,必然漂移 | 本文曾有三个版本(叙事 / 说明 / 分享),三处数字各自腐烂过:条目数 126 与 129 互不一致、拦截数写 13 而实际 16、开放缺口写 3 而实际 0。已合并为一篇 —— 合并不是编辑偏好,是这条判据的执行。 |
| D | 验收证据必须在仓里、在 CI 里 | 把 D:\下载缓存\test.txt 当验收标准 = 借来的证据:今天比真的还真,明天随下载目录一起消失 |
| E | "这个文件如果写错了,谁会红?" | scripts/*.mjs 既不在 typecheck、也不在 lint、也不在测试里,而它打印的正是"验过了 / 没验"的分界线 |
| F | 深查要换维度,不是换样例 | 同一维度加更多样例,盲区却在维度上:两条"代码写着支持、却从未端到端跑过"的分支 |
| G | 生成物也要核实,不是只核实源 | 源码全绿,但 dist/ 里旧模块还在,而发布白名单收整个 dist/ → 已发布的包里带着 5 个无源模块 |
| H | 本地绿 ≠ CI 绿;"CI 绿"也不等于"CI 在跑" | 本仓 CI 从 #1 到 #38 38 次全红、一次没绿过,而本地 npm run check 一直是绿的。修好后的第一次绿之前,它先抓出一条只在真实 runner 上才暴露的缺陷:测试默默依赖"作者机器上恰好有那两个业务仓" |
还有一条,是关于未验证的
交接文档里有说明「本轮没验过的维度」:长路径、大 KB 性能、并发落盘、 真 MCP 客户端联调、push 到真远端、PowerShell 文本管道、生成的 CI 真实执行。
它具体在哪:
collab-cli/working-memory/tasks/2026-09-26-session-handoff.md§3.4。 本行原先只说"交接文档里有说明"、没给路径 —— 而 KB 的AGENTS.md又明写 "本仓没有working-memory/,别去找",于是读者在 KB 里翻不到、也不知道该去哪个仓找。 这是"引用不指向"的一种:不是路径写错,是根本没有路径。后来怎么样了(2026-09-26 晚补记):7 条里 3 条变成了测试 (
collab-cli/src/cli/commands/__tests__/robustness.test.ts:空格与中文路径、 400 条 KB 的时间预算、并发apply不半写);Windows 长路径(>260)仍未验; 剩下 4 条需要外部环境 —— 而"生成的 CI 真实执行"当天就被撞上了: 两个仓的 CI 从来没跑起来过(npm ci配 pnpm 锁文件;collab-cli38 次全红、 KB 的Validate11 连红)。修完当天就绿了(那次是collab-cli历史上第一次绿); 而且它绿之前先做了件更有用的事:抓到一条本地永远抓不到的缺陷(见上表 H)。
十一、它现在是什么状态(可安装的部分)
@chahuajia/collab-cli —— 能用、有证据,但还没被第二个项目验证过。
npx --yes @chahuajia/collab-cli --version # 先看装到的是哪个版本
npx --yes @chahuajia/collab-cli --dir <你的知识库> validate
这里故意不写版本号 —— 写死的版本号在你读到它的时候已经过期了,
--version打印的才是真的。 但有一条要记住:parse的粘贴协议换过(块边界从===== FILE:分隔符改成条目自描述的 frontmatter)。旧版(0.5.x 及以前)对同一份 AI 输出会整单拒收 —— 装之前先看版本。
为什么不是 1.0:核心命令稳定(测试全绿 + "跳过必须申报"的门禁), 但"读了到底有没有用"至今不可判定——唯一干净的对照实验测出零差异。 版本号里应当写着这件事。 (要当前测试数就自己跑
pnpm run test:ci—— 本文不抄。)
三条接入通道(MCP 只是其中一条)
| 通道 | 适合谁 | 代价 |
|---|---|---|
| MCP | 支持 MCP 的客户端(Codex / Claude / Cursor) | 注册一次 |
| CLI 直调 | 有 shell 的 agent | 无 |
| 粘贴协议 | 无 IO 的聊天窗口 | 人工粘一次 |
codex mcp add collab -- node <repo>/bin/collab.js mcp --dir <你的知识库>
MCP 只暴露 6 个只读工具(catalog / read / search / validate / parse / apply_plan)——
没有 commit / push。
因为:"AI 不 commit、不 push"不是写在文档里的叮嘱,而是工具表里不存在那一项。
它适合接在哪
一个 MCP server 指向唯一一个知识库,所有项目共用 —— 项目侧不需要各建一份 KB。
(真的需要独立 KB 时才 init --profile kb;多数情况是 fork,不是 init。)
整套东西 —— 包括上面每一个失败 —— 都在仓库里:
- 知识库:github.com/chahuajia/c…
- 工具链:github.com/chahuajia/c… (npm 上叫
@chahuajia/collab-cli)
npx --yes @chahuajia/collab-cli --dir <你的知识库> validate
想搬走的话,从两本账本和一扇会红的门开始,不要从 129 条开始。
关于维护:先说清楚
这个项目我大概不会再继续维护了(个人原因)。但它不是"半成品被丢下":
- 它的自我检查都在机器里 —— 你 fork 之后,
collab validate与 CI 会告诉你这套东西在你那儿还跑不跑得动; - 它最值钱的部分(两本账本 + 入库门槛 + 那根会亮的线)本来就不依赖作者在不在:抄走就能用。
发出来是抛砖引玉 —— 批评、指导、fork、拆开各用一半,都欢迎。 (我可能不会及时回 issue,这句也说在前面。)
顺手记两个有意思的项目(同名不同物)
写这篇文章时撞见的,放在这里以免混淆:
- Codex、Obsidian、Zotero 联动的论文库工作流(视频): www.bilibili.com/video/BV17F…
- yinsang0910-star/collab-cli —— "Universal collaboration protocol + CLI for multi-agent LLM teams"。
关于第 2 个顺便解释一件事:collab-cli 这个 npm 名字是他们的(collab-cli@1.6.x),
所以我这边的包名带作用域:@chahuajia/collab-cli —— 看到两个"collab-cli"时不用困惑。
两个项目同名但不同路:他们做多 agent 团队的协作协议 / CLI,
我这里做一个知识库的校验、修剪与门禁。