简体中文 | English
用 Rust 从零实现的 WebAssembly 2.0 解释器,以 W3C wg-2.0 冻结快照的官方
test/core 全量语料为验收基准,采用 fail-closed 记账,并与同一 commit
构建的官方 OCaml 参照解释器交叉验证。
这个仓库同时是两份交付物:
- 工程成果 —— 解释器本身,以及冻结、由 CI 强制的验收结果(见下方表格): 148 个测试文件、54,006 条命令全部判定,52,915 PASS / 0 FAIL / 1,091 UNSUPPORTED(后者全部属于文本格式方法边界,非语义豁免)。
- 自主 Agent 实验 —— 全部实现产生于一次单轮规格驱动的自主运行:
输入一份人类撰写的规格,输出一个已合并、可复现的仓库,技术指导 0 次、
人工代码修改 0 处。计入的人类介入共 3 次,全部为权限/环境解锁;干预日志
另外披露了一次不计入的交互(用户转贴公开 review bot 的评论,Agent 独立
经 API 重新取回原文核实)。从规格输入(2026-07-17 16:01:48Z)到 PR 合并
(2026-07-18 00:53:39Z)约 9 小时,其间经过 6 轮外部 Codex review
(29 项发现全部修复)、独立的计划与执行审计、3 组负向对照,以及
fresh-checkout 复现(全管线 25 秒,作者机器实测)。详见
溯源与自主运行,以及冻结的运行记录
goal-runs/wasm-zero-oneshot/。
深入阅读:中文 case study · 证据直达链接 · 复现路径
| 指标 | 数值 |
|---|---|
| 语料 | WebAssembly/spec tag wg-2.0(fffc6e12),test/core 90 个文件 + test/core/simd 58 个文件 |
| 命令总数 | 54,006 |
| PASS | 52,915 |
| FAIL | 0 |
| UNSUPPORTED | 1,091(全部为 module_type == "text",见下方方法边界) |
记账遵循 no-silent-skip:每条命令恰好得到 PASS、FAIL、UNSUPPORTED 之一,
运行器产出的 ledger 由独立枚举脚本(scripts/enum_corpus.py)交叉核对,
无法识别的命令、动作或值类型一律判 FAIL,绝不跳过。
这个仓库由 AI Agent(Claude Code 驱动一套 plan-execute-audit harness,运行
记录标识为 runner: claude-gah)依据一份人类撰写的规格端到端建成。它是
一次规格驱动的自主工程实验,而不是「一句话进、代码出」:输入是一份精确的验收
契约,其下游的全部工作(规划、架构、实现、oracle 搭建、负向对照、CI、review
修复、合并)均由 Agent 完成。
| 自主性指标 | 数值 | 证据 |
|---|---|---|
| 人类撰写的规格 | 1 份(初始 prompt,冻结为 AC1-AC7) | contract.md |
| 技术指导 / 人工代码 | 0 / 0 | intervention-log.md |
| 人类介入(全部为权限/环境类) | 3 | 同一日志,逐条分类 |
| 墙钟时间:规格输入 → PR 合并 | ≈ 9 小时(2026-07-17 16:01:48Z → 2026-07-18 00:53:39Z) | contract.md 第 68 行;PR #1 |
| 外部 review | 6 轮 Codex,29 项发现(7 P1、22 P2)全部修复;第 6 轮 clean | PR #1;修复 commit 2a4fc2d ba95121 d3f8d67 44df91d 9a0622f |
| 负向对照(记账必须变红) | 引擎缺陷 → FAIL=328;validator 无条件放行 → FAIL=2,146;未知输入 → 4/4 FAIL | 负向对照日志 |
| fresh-checkout 复现 | 全管线 25 秒,退出码 0(作者机器实测) | evidence.md |
flowchart LR
A["单次规格输入<br/>(冻结契约 AC1-AC7)"] --> B["计划 +<br/>独立计划审计"]
B --> C["语料与 oracle 基线<br/>148 个 .wast 经 wast2json;<br/>OCaml 参照解释器 148/148"]
C --> D["实现<br/>解码器 / 校验器 /<br/>解释器 / SIMD"]
D --> E["fail-closed 运行器 +<br/>双重记账"]
E --> F["负向对照 A/B/C"]
F --> G["CI 硬门:<br/>54,006 条全量扫描"]
G --> H["独立执行审计"]
H --> I["PR #1 +<br/>6 轮 Codex review"]
I --> J["合并 3d06be1"]
J --> K["fresh-checkout<br/>复现,25 秒"]
| 声称 | 到哪里核实 |
|---|---|
| 冻结的验收契约(AC1-AC7,实现开始前写定) | contract.md |
最终 ledger:54,006 / 52,915 / 0 / 1,091,accounting_ok |
ledger-final.json(末尾 totals 块) |
| 每一次人类介入及其分类 | intervention-log.md |
| 时间线与里程碑日志 | execution-log.md |
| 负向对照 A/B/C 原始输出 | negctl-a · negctl-b · negctl-c |
| Oracle 扫描(OCaml 参照解释器,148/148 退出码 0) | oracle-sweep.log |
| 外部 review 全过程(6 轮,29 项发现) | PR #1 |
| CI 定义与最近运行 | ci.yml · Actions |
| 深度中文解读(任务难点、失败与恢复、review 价值、non-claims) | docs/case-study.zh-CN.md |
crates/wasm-core—— 引擎(零依赖):decode.rs—— 严格的 wg-2.0 二进制解码器(LEB128 宽度与符号校验、 段顺序与段大小强制、完整操作码空间,含0xFC与 SIMD 的0xFD空间)validate.rs—— 规范附录定义的类型检查器(带 bottom 值的操作数栈与 控制栈)、常量表达式规则、已声明函数引用、导入与 limits 检查store.rs/exec.rs/simd.rs—— 按 wg-2.0 语义完成实例化,以及 一个迭代式解释器(显式帧栈,因此调用栈耗尽是确定性 trap);浮点值全程 以原始位模式携带,以保住 NaN payload
crates/spec-runner—— 驱动 wast2json 转换后的语料并产出 ledger。判定 规则(NaN 模式、trap 消息匹配、malformed 与 invalid 的阶段区分)都在这里。
实现面是二进制格式。文本格式前端委托给官方 WABT 工具链(wast2json
1.0.41,SHA256 锁定):.wast 脚本被转换为 JSON 命令加二进制模块。其中
1,091 条以带引号文本形式给出模块的 assert_malformed 断言,测的是文本解析器
本身,计为 UNSUPPORTED 并在 ledger 中逐行归因 —— 这是方法边界,不是语义豁免。
全部 2,146 条 assert_invalid 与 719 条二进制 assert_malformed 都在驱动集内
并且通过。
trap 消息匹配规则:assert_trap 通过的条件是动作确实 trap,且两条消息互为
前缀(规范标准消息,例如 uninitialized element 与
uninitialized element 7)。invalid 与 malformed 类期望还要求失败发生在正确
的阶段(解码 vs 验证),而不要求消息完全相等。
环境为 Linux 或 Windows Git Bash,需要 Rust(stable)、Python 3、curl、git。
scripts/fetch_spec.sh # 克隆锁定在 wg-2.0 (fffc6e12) 的 spec
scripts/fetch_wabt.sh # WABT 1.0.41 release,SHA256 校验
scripts/convert_corpus.sh # 148 个 .wast -> build/wast-json/
cargo run --release -p spec-runner -- \
--expect-total 54006 --expect-unsupported 1091 \
--ledger-out build/ledger.json
python scripts/enum_corpus.py --ledger build/ledger.json后两条命令在出现任何 FAIL 或记账不一致时以非零退出。CI 执行的正是这套序列,
外加 cargo fmt --check、clippy -D warnings 与单元测试。
语料与 oracle 的一致性证明,是用同一 spec commit 构建的官方 OCaml 参照解释器
跑完全部 148 个 .wast 文件(逐个退出码 0)。这一步不属于 CI 门禁;重跑方式:
# 任意带 opam >= 2 的 Linux/WSL:
opam switch create wasm-zero ocaml-base-compiler.5.2.1
eval $(opam env --switch=wasm-zero)
opam install -y dune menhir
cd third_party/spec/interpreter && make # 产出 ./wasm
cd .. && for f in test/core/*.wast test/core/simd/*.wast; do
./interpreter/wasm "$f" || echo "ORACLE_FAIL: $f"
done开发过程中,有分歧的 decode/validate 归类一律以官方套件加 oracle 的行为裁决
(绝不通过修改断言来迁就实现);三处裁决记录在 decode.rs 注释与
goal-runs/wasm-zero-oneshot/evidence.md 中。
- 实现 WebAssembly 2.0(wg-2.0 快照):SIMD、bulk memory、引用类型、 多返回值、符号扩展、饱和截断、多表、可变全局变量的导入与导出。
- 未实现:Wasm 3.0 特性(GC、异常处理、memory64、多内存、尾调用、 relaxed SIMD)、文本格式(委托 WABT)、threads,以及超出 spec-runner 所需范围的任何 embedder API。
- 这是一个 correctness-first 的解释器,不是面向不可信生产负载加固的沙箱, 也未做性能调优。
- 「全量 test/core」一律限定为该套件的 wg-2.0 冻结快照。
- 不把这次实验外推为对 Agent 框架普适能力的证明:它是该框架在低层系统工程、 正式规范与外部权威验收这一维度上的一个强成功样本,单一样本不外推。
Apache-2.0。最新 release: v1.0.0(2026-07-19)。