别人的工具,我们的数字

R0 只在作者机器上成立就不值得引用。这一页说清两件事:怎么把我们的数字搬到别的环境复算,以及怎么把别人的工具放到同一把尺子下。

一、换台机器复算(现在就能做)

R0_SSH_HOST=your-box R0_SSH_USER=root node scripts/r0-remote.ts

它把仓库打包传过去,在对方机器上跑:

→ 跑文件面 R0 … R0 逐字节还原 100% / 全部撤销 100% / 全部入账 100%
→ 跑 UI 面 R0 … R0-UI 状态归零 100%

e2b / daytona / trycua 的机器都行——只要你能 ssh 进去。贴结果时必须写清机器和 node 版本,只写一个百分比等于没跑。

没有机器?--print 看看它打算做什么,不连。

二、把别人的工具放进同一个基准(需要你填 4 个空)

scripts/r0-adapter-template.ts 是给被测工具用的适配器骨架:

export function createAdapter(): R0Adapter {
  return {
    apply(scenario) { /* 用它的 API 执行这批动作 */ },
    undo(scenario)  { /* 调它自己的撤销 */ },
    journalLines()  { /* 它能导出多少条审计记录;没有就 0 */ },
    snapshot()      { /* 状态快照 */ },
  };
}

写好后:

node scripts/recovery-bench.ts --adapter ./scripts/r0-adapter-e2b.ts

基准会拿同一批场景(嵌套写、移动覆盖、文件夹分类、移进新目录;UI 侧还有 move/type/invoke)去跑,然后给出它自己的 R0。

这个基准会当场揭穿三种作弊

| 作弊方式 | 基准怎么发现的 | | --- | --- | | 在 undo 里自己 rm -rf 重建目录 | 那不是它的撤销,是你的——journalLines 会是 0,rollback 率对不上 | | 把 journalLines 写成动作条数 | 审计记录和动作条数是两件事;r0-negative-test.ts 就是拿这个当反例钉住的 | | 只跑成功场景 | 每个场景都在第 1..N 步强制注入失败;跳过注入就等于没跑 |

这也解释了为什么 scripts/r0-adapter-naive.ts 会诚实地拿到 0/0/0——一个永远都过的基准是广告,不是测量。

三、三个候选,各自缺什么

| 工具 | 拿到能跑的状态需要 | 现在的状态 | | --- | --- | --- | | e2b | E2B_API_KEY + 一个 template;动作走它 SDK 的 fs API | 未跑(缺 key) | | daytona | workspace + API token | 未跑(缺 token) | | trycua | 一台 macOS 机器(它编排的是真 macOS 虚拟机) | 未跑(缺机器) | | 你自己的 Docker | docker run -v $PWD:/w -w /w node:22 | 可以用 r0-remote.ts 的 docker 变体直接跑 |

一句话:这四个里任何一个跑通之前,R0 只是"在 Windows 上和 Mock 驱动上成立"。文档里也是这么写的,没有拔高。