34 天 33 个版本:rvs(rust-verb-shell)如何用版本号对抗 AI 误判
1. 引言
一个 shell 在 34 天里迭代了 33 个版本,几乎每天一个版本号。rvs(rust-verb-shell)是面向人类和 AI Agent 的结构化命令运行时,核心模型是Command → Value → JSON → AI。2026 年 8 月,它从 26.8.10 迭代到 26.8.43。触发点不是功能堆砌,而是三类真实场景反复暴露问题。
2. 三类真实场景:版本迭代的触发点
rvs 的高频迭代并非为了堆功能,而是被三类真实场景反复逼出来的。
2.1 AI Agent 把终端输出当文本流解析
rvs 的非交互输出混入包装信息,污染 scp、sftp、tar-pipe 管道;--json输出早期格式不统一,Agent 只能解析文本。
2.2 对话式 AI 仅凭终端字符把 rvs 误判为 POSIX shell
实测生成echo A; echo B、$var展开等不兼容语法,执行结果与预期完全不符。
2.3 多台异构运行机登录 shell 都是 rvs
物理 tty、Windows 控制台、emoji、UTF-8 等跨平台差异逐个暴露,每修一个都值得一个版本号。
3. 谬误溯源:三个被反复证伪的认知
回顾这 33 个版本,最值得记录的并不是功能列表,而是三个被反复证伪的认知。
3.1 "rvs 是 POSIX shell 的兼容实现"
实测:非交互解析与 POSIX 不同,;不分隔命令(echo A; echo B只出A;)、$var不展开。已决策不兼容 POSIX,靠输出自我标识([rvs]前缀 + 非 POSIX 声明)纠正 AI 误判。
3.2 "CPU 制程数据库按型号精确匹配"
26.8.38 实测:i5-8265U 显示 65W 桌面功耗,实际 15W。根因是子串匹配 + 通配条目抢先命中,修正为精确条目前置(Whiskey Lake / Kaby Lake R)。
3.3 "flag 在位置参数前没问题"
26.8.42 实测:list-items --llm <path>的 path 被 flag 静默吞掉,回落到当前目录且 exit 0,极难发现。
4. 源码验证:33 个版本做了什么(按主线归类)
抛开版本号本身,把 33 个版本按主线归类,可以看到每一次迭代都落在真实场景的修复上。
4.1 AI 可消费性(26.8.32/33)
--json提供三档输出:Pretty、Compact、Llm(token 优化);RunReport.error_type枚举化,不再是自由字符串;schema 快照测试锁定 JSON 结构,防止回归。
4.2 沙盒安全(26.8.35)
沙盒操作审计写入~/.config/rvs/audit.jsonl(who/what/when/where/how);sudo、doas、su在解析前直接拒绝(error_type=sandbox_violation);--dry-run全局开关,外部程序与 remove-item 只预览不执行。
4.3 系统信息(26.8.27/35/37/38)
show-fetch采用 neofetch 风格,默认安全输出 +--all全量,磁盘统计默认仅物理盘;show-memory提供内存槽位级信息(Windows wmic / Linux dmidecode / macOS system_profiler,Apple Silicon 标记「不适用」,无权限降级 sysfs);内置 CPU 制程/TDP 数据库(i5-8265U 15W、N3050 6W、Xeon 8168 205W、QEMU 兜底)。
4.4 远程屏幕监视(26.8.19-26)
virtual-screen 落盘共享(跨进程可读);monitor 升级为 ratatui TUI 分屏 + 状态栏按键说明 + 等待模式;monitor-set 远程切换监视目标。
4.5 跨平台收敛(26.8.23/39/40)
物理 tty 中文/emoji 降级 ASCII;Windows 强制 UTF-8 代码页 65001,表格使用控制台窗口宽度;Windows emoji 降级 ASCII。
4.6 解析修复(26.8.15/42)
ssh 智能分流(无--command走真实 OpenSSH);fill_positionals按命令元信息识别 switch 参数,flag 不再吞位置参数;--help拦截改用注册命令名。
4.7 实测数据
rvs --json -c 'show-version'输出带 schema 版本号的 JSON;N3050 无 dmidecode 时 show-memory 降级 sysfs 统计 32 块 × 128 MiB = 4 GiB,与硬件吻合;go-to-bottom(别名 bottom)清屏后光标落终端末行(crossterm::terminal::size()+MoveTo(0, rows-1))。
5. 落地结论:可复用的模式
回顾这 33 个版本,真正值得沉淀的不是功能清单,而是五条可复用的设计模式。
5.1 AI 接口与人类交互分离
终端是人类观察面,JSON 是 AI 消费面;两套输出各自纯净互不污染(包装信息走 stderr,stdout 纯净透传)。
5.2 错误类型枚举化
error_type使用枚举而非自由字符串,Agent 按类型分流处理,不用解析文本。
5.3 自我标识
终端输出让任何读者(人类或 AI)第一眼识别「这是谁、什么语义」——[rvs]前缀 + 非 POSIX 声明,避免被误判为 bash/PowerShell。
5.4 文档-代码一致性守卫
pre-commit 校验 locales 版本号、文档命令数与all_commands()注册数一致,防止文档漂移。
5.5 降级而非伪造
读不到硬件信息时明确标注「不适用/不可用」,绝不伪造数据(Apple Silicon 内存槽位即如此)。
适用范围:Verb-Noun 命名的 Agent 接口 shell、需要多机跨平台部署的命令行工具、任何「既要给人看又要给 AI 消费」的 CLI。
6. 三类读者速查
6.1 人类开发者
- 查看版本与构建信息:
rvs show-version - 体验:
cargo build && ./target/debug/rvs,REPL 里敲list-commands看全部 41 个命令 - 更新记录:
docs/ROADMAP.md「已实现」+docs/issues-2026-08-02.md1.x 记录
6.2 对话式 AI
- 一句话问法:「rvs 和 POSIX shell 有什么区别?」
- 回答要点:rvs 是面向 AI Agent 的结构化命令运行时,非交互解析不兼容 POSIX(
;不分隔、$var不展开);结构化数据用--json拿。
6.3 代码 Agent
- 结构化输出:
rvs --json -c 'list-items'(Pretty/Compact/Llm 三档) - 破坏性操作前预览:
rvs --dry-run remove-item <path> - 沙盒审计:
~/.config/rvs/audit.jsonl逐条结构化记录
7. 总结
rvs 的 33 个版本,本质上是与 AI 误判和跨平台差异持续对抗的过程。每一次版本号递增,都对应一个真实场景的修复,而不是为了刷版本号。
