Skip to content

Repository files navigation

简体中文 | English

wasm-zero

用 Rust 从零实现的 WebAssembly 2.0 解释器,以 W3C wg-2.0 冻结快照的官方 test/core 全量语料为验收基准,采用 fail-closed 记账,并与同一 commit 构建的官方 OCaml 参照解释器交叉验证。

这个仓库同时是两份交付物:

  1. 工程成果 —— 解释器本身,以及冻结、由 CI 强制的验收结果(见下方表格): 148 个测试文件、54,006 条命令全部判定,52,915 PASS / 0 FAIL / 1,091 UNSUPPORTED(后者全部属于文本格式方法边界,非语义豁免)。
  2. 自主 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 · 证据直达链接 · 复现路径

验收结果(冻结,CI 强制)

指标 数值
语料 WebAssembly/spec tag wg-2.0fffc6e12),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 秒"]
Loading

证据直达链接

声称 到哪里核实
冻结的验收契约(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 elementuninitialized element 7)。invalid 与 malformed 类期望还要求失败发生在正确 的阶段(解码 vs 验证),而不要求消息完全相等。

复现路径

环境为 Linux 或 Windows Git Bash,需要 Rust(stable)、Python 3、curlgit

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 --checkclippy -D warnings 与单元测试。

Oracle 交叉验证(参照解释器)

语料与 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)。

About

Zero-dependency Wasm 2.0 interpreter in Rust. Full official test/core at wg-2.0: 54,006 commands, 52,915 PASS / 0 FAIL / 1,091 UNSUPPORTED (text-format method boundary). Fail-closed CI accounting; OCaml ref-interpreter oracle 148/148. Agent-built from one spec, 3 permission/env-only interventions. Apache-2.0, v1.0.0

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages