iii 开源仓库 · 技术科普 · 2026-09

用 AI 做版本管理与功能迭代

一个真实存在的开源项目(iii,一个用 Rust 写的服务器引擎),把「让 AI 帮忙写代码、管版本、发新功能」这件事 做成了一条不出乱子的流水线。这篇文档用大白话讲清楚三件事:AI 为什么不会乱来、版本号到底是谁定的、 老功能和新功能分别怎么处理。所有故事都来自仓库里真实发生过的记录,每句话的出处可以在附录查到。

大白话讲解 生活比喻 真实案例 可照着自己做
怎么读这篇文章 不需要任何背景知识。每个术语第一次出现时会当场解释; 看到「打个比方」开头的蓝色提示框,就是生活化的类比,读不懂术语时先看它; 想较真的人,附录里有每条结论的查证方法。
页面目录

全景:先把项目想象成一家餐厅

核心结论(一句话版) 在 iii 这家「店」里,人只干两件事:想清楚要做什么(写一张点菜单),以及在关键时刻签字拍板 (合并代码、决定何时发布)。中间的切菜、炒菜、抄写菜单、贴价签、归档旧菜单——全部交给 AI 和脚本。

先建立一张对照表,后面所有内容都能在这张表里找到位置:

店里的东西项目里的对应物它管什么
顾客的点菜单tech-specs/(规格文档)这次要做什么、为什么做
厨房代码(engine/ 等)真正干活的地方
员工手册skills/(技能文档)这家店的基本功和规矩
自动打印的小票API 参考文档菜变了小票自动重印,没人手写
下期菜单的草稿区docs/next/新功能的说明先写在这里
过刊收藏架docs/0-XX-0/每个旧版本的完整快照
新来的帮厨AI手脚快、不抱怨,但必须守规矩

这家店最重要的家规是:真正需要动手写的东西只有三处,其余全部由机器自动生成、 自动检查、自动归档。用图表示:

打个比方:为什么 AI 想乱来都没有机会 帮厨(AI)想自己印小票?小票是收银机连着厨房自动打的,手写的会被对账时揪出来。 想改老杂志?过刊架在库房,钥匙在发版程序手里。想定价格?价签由总部统一发。 不是 AI 特别听话,是店里根本没给它犯错的岗位。

AI 的「入职资料包」:上下文怎么组织

让 AI 干活,最大的问题不是它不会,而是它不了解你家的规矩。 iii 的做法像给新员工发一套入职资料——而且「到了哪个岗位才发哪本」,不是把整个文件柜一次性倒给你。 (喂给 AI 的这些材料,行话叫「上下文」。)

资料回答的问题对应文件什么时候发给 AI
员工守则 怎么干活、什么绝对不能碰 AGENTS.md(共 170 行) 每次开工自动带上
岗位细则 干这类活要注意什么 .cursor/rules/ 干哪种活才发哪本(按文件类型自动匹配)
师傅的带教节奏 先做什么后做什么、何时停下来 doc_workflow.md 干文档类活时必发
业务知识库 这家店的菜是怎么设计的 skills/*/SKILL.md 按需领取,还能装到自己电脑上
这次的活单 具体要做什么、为什么 tech-specs/<名字>/ 接到任务时发
门禁 干错了能不能被拦下 本地检查 + 云端检查 每次提交 / 推送时自动过

员工守则的精髓:「必须 / 先问 / 绝不」三栏

AGENTS.md 把规矩分成三栏写。最值钱的是中间那栏「先问」—— 它把 AI 的自作主张变成提问:

打个比方:「先问」这栏 就像实习生完全会用网银转账,但公司规定:动公司账户之前,必须先找老板签字。 能力上做得到,和被允许直接做,是两回事。iii 规定:要改对外发布的接口、要动服务器通信协议、 要改自动化流程——AI 必须先停下来问人。
# AGENTS.md(节选,实文 170 行)
### Always   (必须)用 pnpm 工具;提交前先跑格式化;接口路径写 /orders 这样的斜杠开头;
           定时任务的配置字段叫 expression;功能起名用 冒号冒号 分隔,如 orders::validate
### Ask First (先问)改对外发布的 SDK 接口;改服务器通信协议;改 CI 自动化;加新的引擎模块
### Never    (绝不)提交密钥;直接推送到主分支;改软件许可证

师傅的带教节奏:每一步都停下来给你看

打个比方:装修队铺地板 先出铺法图纸,等你点头再动工(计划);每铺完一个房间,叫你来看一眼再铺下一间(分块检查); 全部满意才结账走人(提交)。iii 把这个节奏写成了文件里的死规矩—— AI 每写完一块必须停下来问「这段可以吗?我继续下一块?」,不靠人每次口头喊停。
第 1 步 · 计划     列出文件结构和章节 → 停下,等人点头
第 2 步 · 动手     一块一块写(一个完整章节算一块)
第 3 步 · 检查     每块写完停下:"Review this section. Shall I proceed?"
第 4 步 · 提交     建议一条提交说明,格式 scope: 简短描述
三个设计要点(白话版)

1. 规矩直接给范例——不说「请注意命名」,而是给出可以直接抄的代码例子,AI 照抄就行。

2. 知识手册不带版本号——手册教的是「这家店有三样基本功」这种长期不变的概念,所以版本从 0.19 升到 0.21,手册一个字不用改。

3. 资料按岗位发——改文档时只发文档岗的手册,不把整个文件柜倒给 AI,免得它被无关信息淹没。

发版像点外卖:版本管理自动化

很多人觉得「发版本」是件大事:要改版本号、要同步一堆配置文件、要把旧文档归档…… 漏一步就是事故。在 iii 这里,这些事全部由程序完成,人做的动作相当于打开 App、选好规格、下单。

3.1 什么是「版本列车」?

打个比方:公交车 新功能像乘客,随时上车;车按班次发出,每一班叫 next.1、next.2…(试运行班, 只发给愿意尝鲜的人);哪天公司觉得这班车够稳了,就让它「转正」变成正式班(比如 v0.21.3)。 因为发车只剩按按钮,这个项目在两周内发了 6 个正式版。

下面是 0.21 这趟车的真实发车记录(日期来自代码仓库的标签历史):

2026-06-24
v0.20.0 正式版 — 上一趟车到站;同日新列车开始售票
2026-07-03
功能代码合入 + 第一班试运行车发出 — 新功能合进主线的当天,试运行班就上路了
2026-07-07
更多功能上车 — 后续功能陆续合入,班车继续编号
2026-07-08
v0.21.3 转正 — 更新日志用大白话向用户总结这批新功能
2026-07-09
v0.21.4 转正 — 一天之内连发两班试运行后直接转正
2026-07-14
v0.21.5 转正 — 目前最新的正式版

3.2 版本号是谁定的?——收银机,不是店长

版本号不是人开会拍出来的,是一个小程序按死规矩算出来的。 程序开头注释写着「纯函数放在文件顶部,方便单元测试」——意思是这套规则像收银机算账一样死板, 而且给收银机本身配了体检(专门的测试代码)。

规矩一:说「接着编号」→ 当前班车继续 next.1 → next.2 → next.3,目的地不变
规矩二:说「转正」→ 试运行的号码直接变成正式版(next 班变 v0.21.4)
规矩三:alpha / beta / rc 是不同级别的试运行,发布到各平台时格式自动换算

3.3 发版按钮长什么样?

就像点外卖选规格,填四个选项,剩下的全自动:

选项选什么大白话
targetiii发哪个产品
bumppatch / minor / major / none这次算「改错字」「加新章节」还是「整书重编」
prereleasenone / next / alpha…选 none 才转正并整理文档;选其他就是试运行
dry_runtrue / false要不要先「消防演习」一遍(演习不惊动任何人)

按下按钮后的流程一句话:先检查新文档备齐没有(没备齐就发警报停止)→ 整理归档 → 打上版本标签 → 各平台自动上架。

3.4 换价签:一次换完所有门店

打个比方:连锁店调价 版本号要同时出现在四个地方(Rust、npm、Python、Go 各自的配置文件)。 iii 用一个程序一次全改好——像连锁店总部调价,所有门店的价签同一时刻全部换掉, 不靠店员挨个手改(手改必漏)。真实证据:仓库里 Go 的版本标签和引擎的版本标签总是同一天成对出现。

3.5 杂志社的归档制度

打个比方:月刊编辑部

· 草稿区(docs/next/):下一期杂志的内容先都在这写。

· 期刊上市(发正式的大版本):草稿区整体变成当期杂志;上一期原封不动搬进过刊库(docs/0-XX-0/),一个字不改。

· 勘误重印(发小的 patch 版):只更新当期,不动过刊库——所以仓库里有 0.21.5 却没有「0-21-0」这一排过刊。

· 试读本(试运行版):印刷线完全不碰。每期的卷首语(更新日志)则永远留在架上。

注意:AI 在发版这件事里的戏份是零 版本号、归档、改链接、打标签——全按死规矩由程序执行。这不是不信任 AI, 而是分工:机器擅长死规矩,人擅长拍板,AI 擅长中间的打字。

新菜与老菜谱:两类改动的上下文

开新功能像研发新菜:看菜单(要做什么)、翻手册(基本功是什么)。 修老功能像照着老菜谱回锅:得先找到当年的菜谱(代码历史)、翻翻那期的杂志(当版文档)、 看看当时的卷首语(更新日志)。两类活要拿的资料完全不同,但写东西永远只写在一个地方——草稿区。

资料放在哪谁写的用多久
新菜的说明docs/next/ 草稿区人 + AI发版时变成正式文档
点菜单tech-specs/人写、AI 帮忙永久保留
老菜谱(旧版文档)docs/0-XX-0/ 过刊库没人写(机器复制的快照)永久冻结,不用维护
每期卷首语docs/changelog/人 + AI每版一段
员工手册skills/人 + AI长期不变
自动小票API / CLI 参考文档机器(从代码生成)代码一变就重印

拿资料的方向,一句话记住

新菜只写草稿区。AI 永远不用回答「我这算哪一期」——上不上刊、上哪期,是发版程序的事。

老菜谱零维护。过刊是机器搬的快照,从来不需要人回头修。想了解当年的做法?去查档案(代码历史 + 过刊库),而不是改档案。

小票必须自动打印。改了菜(代码),小票(参考文档)必须自动重印;如果有人手写小票或忘了重印,云端对账直接亮红警告——不是等人肉眼发现。

资料按岗位发。干哪类活发哪本手册,不搞「全量文件柜倾倒」,AI 的注意力也是资源。

一个真实故事的完整回放

0.21 版本的主打功能——「让任何程序都能动态注册触发器」(可以理解为:给餐厅加了一个 「临时加菜窗口」,不用重启厨房)——从想法到用户手里,全过程都有记录。这个故事的价值在于: 它是整套机制的一次完整走位。

阶段 ① 写点菜单 · 2026-07-03
需求文档随代码一起提交:tech-specs/engine-register-trigger-metadata.md
阶段 ② 厨房做菜 · 同一批提交
核心代码改动:主文件 +383 行、通信协议 +44 行、触发器 +22 行
阶段 ③ 写菜单说明 · 同一批
手写草稿区文档:使用说明 +16 行、开发者文档 +43 行
阶段 ④ 小票自动重印 · 同一批
API 参考文档和 AI 简版手册同步更新(机器生成,同一次提交里能看到)
阶段 ⑤ 门禁放行 · 提交审核时
云端自动跑引擎测试 + 四种语言的接口测试,全绿才允许合入
阶段 ⑥ 上班车 · 之后
试运行班首发,之后一路 next → 转正,直到 v0.21.5(2026-07-14)
阶段 ⑦ 写卷首语 · v0.21.3 转正时
更新日志用用户听得懂的话总结:「随处注册触发器」

5.1 换到 AI 的视角:它的一天是怎么过的

下面的「剧本」是从 AI 的角度重演这一天。人输入的话在左边, 注释标出 AI 拿到了什么资料、产出了什么。读的时候数一数人一共说了几次「好,继续」—— 那几次就是人在拍板,也是整套机制里人不可替代的部分:

【第 1 轮 · 接活】
人:读一下需求文档 engine-register-trigger-metadata.md,
    把它做成引擎内置功能,四种语言的接口都要支持。
# AI 拿到:员工守则(自动) + 点菜单(需求) + 员工手册(基本功)
AI:给出实现计划——列出要动的文件,并主动标注:
    "这次要改通信协议,守则里写的是「先问」,需要你确认"
人:协议改动我评审过了,继续。                      ← 拍板 1

【第 2 轮 · 出图纸,等点头】
AI:文件结构清单 + 分块施工计划,停住
人:按这个做。                                    ← 拍板 2

【第 3 轮 · 一块一块做,每块停一次】
块 1  通信协议文件         新增消息类型 (+44 行)
块 2  核心功能文件         注册/注销/元数据透传 (+383 行)
块 3  四语言接口           Rust/Node/Python/Go 各自符合语言习惯的写法
                          (比如 Python 只在用户声明了参数时才多传一个参数)
每块做完 AI 都问一句 "这段可以吗?我继续下一块?"
人:(抽查关键块)可以。                           ← 拍板 3..N

【第 4 轮 · 写说明 + 重印小票】
AI:手写草稿区文档 → 跑工具重印 API 参考 → 刷新 AI 简版手册
护栏:本地提交检查先拦一遍格式问题

【第 5 轮 · 建议提交说明】
AI:建议写成 "feat: engine::register_trigger + first-class
    invocation metadata (#1928)"
    (格式约定 + 编号;提交、推送、开审核单都是人来按)
人:提交 → 审核单描述「改了什么/为什么」→ 门禁全绿 → 合入

【第 6 轮 · 发版(AI 完全不参与)】
人:打开发版按钮,选「小版本 + 转正 + 先演习一遍」
机器:检查文档备齐 → 归档轮转 → 换价签 → 贴版本标签

5.2 对照:修一个老功能,AI 拿的资料完全不同

人:0.20 版本里 RabbitMQ 消息队列的优先级功能,高并发时会丢优先级,修一下。
# AI 拿到:员工守则 + 代码历史(搜 "max_priority" 定位当年谁改的、怎么改的)
#          + 过刊库里 0.20 那期的杂志(当年对用户的承诺) + 那期卷首语
AI:只动队列相关代码和测试;
    修复说明写进草稿区(出现在下一期杂志上),过刊库一个字不碰;
    提交建议写成 "fix(queue): ..."
两个故事合起来的结论 做新东西,资料包是「点菜单 + 手册」(往前看); 修老东西,资料包是「代码历史 + 过刊 + 卷首语」(往后看)。 无论哪种,写只写草稿区。方向清晰,AI 就不会把新内容写错地方。

教程:七步开一家自己的店

这套打法可以搬回你自己的项目,哪怕只是个人小项目。按下面的顺序做,每一步都很小。 时间紧就先做第 1、3、6 步——那是「最小可用组合」。

STEP 1写员工守则(AGENTS.md)

一个 markdown 文件,三栏写法:必须 / 先问 / 绝不。「先问」这栏最值钱——它把 AI 的自作主张变成提问。规矩旁边直接附可抄的代码范例:

# AGENTS.md
## 常用命令        怎么构建、测试、格式化(写确切命令)
## 项目地图        哪个目录是干什么的(一张表)
## 规矩
### 必须    工具用哪个、命名怎么起(附范例)
### 先问    动对外接口 / 协议 / 自动化流程之前,必须先问我
### 绝不    提交密钥、直推主分支
STEP 2写岗位细则

告诉编辑器(或 AI 工具):改哪类文件时自动加载哪份规则。效果是干哪种活才发哪本手册,规则不常驻、不淹没。

STEP 3写带教节奏

把「出完计划停一次、每做完一块停一次、提交前停一次」写成文字规矩。这是防 AI 一口气倒出一大坨没法检查的改动的关键——节奏靠文件,不靠你每次口头喊停。

STEP 4建业务知识库

每个核心概念写一页(相当于员工手册的一章)。每页必写两节:「什么时候用」和「边界在哪」——告诉 AI 什么时候不该用,比告诉它怎么用更能防事故。

STEP 5接活先写活单(tech-spec)

开工前先写半页纸:为什么做、做到哪算完、明确不做什么。然后让活单和实现一起演进(同一个提交单元里都能看到)。AI 读过「不做什么」,才不会自作聪明加戏。

STEP 6装门禁(三层)

① 本地一道最便宜的(提交前自动查格式);② 云端一道狠的(自动生成的东西和源文件对不上,直接亮红);③ 让 AI 当质检员——只贴评审意见,不动手改(下一节讲为什么这条是血泪教训)。

STEP 7把发版变成程序

版本号交给小程序算(规则写死、配测试);多平台的版本号一次全换;旧文档归档交给脚本。做完这步,发版时你只剩两个决定:什么时候发、发大的还是小的。

直接可抄的提示词模板

模板里的 iii 词汇换成你项目的对应物(点菜单 → 你的需求文档;草稿区 → 你的文档目录)即可:

开发新功能时:
先读:员工守则(AGENTS.md)+ 这次的需求文档 + 相关的知识库页面
任务:按需求实现 <功能名>,含测试。
节奏:先给计划,停下等我确认 → 一块一块做,每块停下
      → 同步更新文档 → 最后建议一条提交说明。
红线:不动自动化流程、不动对外接口(要动先问我);
      文档只写草稿区,不碰旧版归档。

修老功能时:
先查:代码历史(搜 "<关键词>",找到当年谁改的、怎么改的)
      + 旧版本文档 + 对应的更新日志
任务:修复 <问题>。修复说明写进草稿区,旧归档只读。

发版前自检:
跑一遍和发版程序相同的检查命令        # 别靠感觉
重新生成自动文档,确认没有遗漏的改动   # 对不上=会亮红

五条踩坑换来的原则

只手写三样,其余交给机器。代码、草稿区文档、知识手册。小票自动打、过刊自动存、价签自动换——AI 不需要「记住」要同步什么,结构替它记住了。

实习生不签字。这个项目真试过让 AI 自动改文档并自动提交,结果翻车,改成了「只评论、不动手」。AI 可以当质检员,但按下提交键的必须是人。证据是自动化配置里那行注释:「只读;本操作不再自动提交」。

对不上就报警。「忘了同步文档」这类错误不靠人眼发现,靠收银台对账:自动生成物和源文件不一致 = 直接亮红。软提醒没用,硬失败才有用。

账让收银机算。版本号、归档位置、链接改写,全按死规矩执行。人只决定「什么时候发、发大的还是小的」。判断越少,事故越少。

检查要拿记录说话。这个项目自己的文档曾在复查时被查出 3–5 处「以为核实过、其实没有」的错误——靠的不是印象,是重新实跑命令。对 AI 的产出更要如此:每个结论都要能指到具体文件和命令输出。

搬家建议 不必一次搬全套。最小组合是 STEP 1(三栏守则)+ STEP 3(带教节奏)+ STEP 6 的前两层门禁; 发版流水线(STEP 7)等你有发布压力了再补。顺序反了,你会把时间花在写脚本上,而不是立规矩上。

附录 · 证据清单

这篇科普里的每个故事都能查证。以下是最初级版教程(进阶版)里的查证方法摘录:

每条结论怎么查(点开查看)
  • 五层资料包:AGENTS.md(170 行、三栏规矩 + 三语言范例)、.cursor/rules/docs.mdc、.cursor/skills/doc_workflow.md 第 3 节、skills/ 目录(共 7 份手册)、tech-specs/ 目录结构。
  • 版本列车:真实标签列表(git for-each-ref refs/tags);版本计算程序 .github/scripts/calculate_release_version.py 及其测试。
  • 换价签:.github/scripts/bump_manifests.py;Go 标签与引擎标签同日成对的记录。
  • 归档制度:docs/ 目录(根目录 = 当期 + next/ 草稿区 + 0-10-0 到 0-20-0 共 9 排过刊;没有 0-21-0,对应 patch 不归档)。
  • 真实故事:git show dc08bab4 --stat(需求文档 + 代码 + 草稿区文档 + 生成文档在同一批提交);docs/changelog/index.mdx 的 0.21.3 段落。
  • 「实习生不签字」:skill-check.yml 第 19 行注释原文「contents: read # report-only; the action no longer commits back」。
想深入的人:关联文档(autoresearch/ 目录)
← 返回内容索引