性质:S9(0.9.0 = 脱钩批 + 裁定批 + 解锁修复面)的裁定判定书(终稿)——三裁定项目的实测证据与终裁、S4 期挂账的销项裁定、脱钩工序验收件(硬准出)。全部结论来自亲跑探针/亲读代码(探针命令与位置随文给出),非脑测推演;裁定经四轮收敛(含三轮用户自我修正:死面摘除移出 S9、#9 改判两路并建、SSPL 定性修正),修正痕迹保留可审计。 状态:终稿(2026-10-05 当日收敛,十项裁定全清)——§6 十项经四轮讨论逐项拍板回填;清扫组按默认动作直接推进,风险组/防线组拍成硬准出(总计划工序③④原文已同步改写)。本档是 S9 开工的执行依据。 后续顺序翻转注记(2026-10-05 晚):用户拍板工序顺序翻转(固化先行→脱钩→修复统一窗口,推翻原「顺序不可换」)——本档 §4 的③清单/④准出三件内容全部不变,仅②「终验放行」降格为③的固化 gate;本档其余「工序②」字样按此口径读。理由与改写原文见总计划 §10 S7 行尾。 面四降格注记(2026-10-05 晚二拍):§4.2「e2e→语料映射闸」降格不做——实测 e2e = oracle 自身端到端防线(遍历语料 + 冻结区 golden),语义守护已由五驱动 digest 清单 + shadow/clang_direct 双锚承接;剩余实质 = KNOWN 8 条史实台账化(DIFF-E2E-KNOWN-LEDGER-01)+ cases_golden 随区退役登记(冻结资产清单工序④连坐面)。§4.1 其余各面不受影响。 连坐:总计划 §10 S9 行(排期权威,本档为其判定依据层);出口分档与宿主策略 §2.3 Wasmtime 声称已随本档实测修正。
一、三裁定(总计划 S9 行裁定批现存三项;C++ 已于 2026-09-20 裁砍不列)
1.1 JIT 复核 —— 已裁定:不搬(确认 F-3)
待裁问题:F-3「JIT 倾向不搬」的依据「宿主 V8 自带 JIT」只对 wasm-gc 出口成立(架构审阅 20260921 §2.5 判 P1),native 出口不成立(门 1 实测 Rust JIT 55ms vs 解释器 512ms = 8.8×)。S9 须给出终判。
实测证据(2026-10-05 探针①):
- 解析
demo/wasm.wasm(gateway wasm-gc 产物 867,318B):功能性 imports 仅wasm:js-string×6(length/charCodeAt/equals/concat/fromCodePoint/fromCharCodeArray)+ 3461 条module "_"字符串常量 global(js-string 提案importedStringConstants机制,编译期满足,非运行时绑定)。零 mmap/mprotect/可执行内存类 API——wasm-gc 沙箱物理上不存在机器码 JIT 落点,模板 JIT(W^X 加载器路线)在主出口是「无处可放」而非「不可行」。 - exports = 承诺 4 函数(invoke/reset/protocol_version/engine_version);宿主侧 host.js 16/16 PASS 复证,实例化零额外绑定。
- 既有实测:门 1 native 8.8×(Rust 期);§16 wasm-gc 全面快 native CLI 1.5–6.3×;§17 bytecode→wasm 生成器仅 2–2.8×、VM 解释循环 vs CPython 差 9.6–19.8×(#41 已挂)。
裁定内容:①主出口(wasm-gc)JIT 无处可放,判死;②native 出口的 8.8× 属「解释器自相比」,且为 Rust 期门 1 历史实测口径(oracle 历史数字——MoonBit 侧无 JIT,不可复测亦无需复测),与 §17 native 反慢于 wasm 4.6× 合读,方向 = 修解释器/依赖宿主加速(#41 原题)而非自搬 JIT;③kimicc W^X 先例(jit/stub.c:139-206,~500 行)保持档案状态不复活;④执行加速合并裁定已收(§3.1)——wasm-GC 生成器不进 0.9.0,四形态谱系见 #41 评论。
1.2 libc 机制形态 —— 已裁定:维持双形态 + 单一路由表
待裁问题:MoonBit 侧 libc 保留 Bytecode 预编译 + Host 双路径,还是收敛单形态。
实测证据(2026-10-05 探针③):
- MoonBit 侧单一路由表已落(
bytecode/route.mbt):派生规则全表唯一——86 名走Call <固定索引>(Bytecode Libc)+ 2 名改判 Host(strcpy/strcat,E3070 栈缓冲校验理由)+ 108 名纯 Host。Rust 侧「20 个 host 名被固定索引静默遮蔽」的病已结构性消除(shadowed_host_names()显式清单 + 锚)。 - Bytecode Libc 是全出口公共装配链活跃形态:session → VM setup →
load_libc_artifact(vm/libc_setup.mbt),wasm-gc 同样装载——不是死代码。 - 对账闸现役:
go run ./scripts/moonbit/libc_single_source -checkCI 接线(ci.yml:485);libc.mbt 包注释口径「第四套真相源已由闸门约束,但未消除」;路由定义点已裁定落 L6 bytecode 包(与总计划原「host 上提 L7」表述相左,已在 route.mbt 头注登记——层位约束 codegen(L6)→host(L7) 不可反向)。 - 新实锤:#39 真值源迁移漏登记第四条生成链——
scripts/moonbit/gen_libc_data/main.go:74输入 =native/crates/vitro_vm/src/bytecode_libc_data.json,锚在 Rust 冻结区。#39 原登记只有三生成器(gen_diag/gen_diagnostics/gen_protocol_ts)。工序④删区即第四链断源。
裁定内容:维持双形态 + 单一路由表(86/2/108 定稿形态)——沉没成本已成事实,收敛纯 Host 等于推翻刚落地的路由表;gen_libc_data 第四链与 #39 是硬绑定而非选项(工序④删区即断源;#39 已评论登记,拍板确认短评论另行补挂)。连带执行件 3c 见 §6 #3;单源回填收尾裁定见下。
连带执行件:① S4 坑②「以 vitro/engine/libc 为单源回填消第四套真相源」——2026-09-22 已实测改形为对账闸(L5→L6 派生不可行),S9 收尾裁定 = 对账闸维持 vs 借 host 包已建之势真收敛;② differential_stress(3c)形态开关——MoonBit 单一路由后每名唯一形态,「同函数 Host/Bytecode 各跑一遍」结构性无实现载体,已裁 (b)+(c) 组合:判 3c 被路由表 + 既有锚结构性替代随 oracle 退役;(c) 的字节级锚(libc_pair_anchor_wbtest——88 对 (name, idx) 硬编码自 Rust bytecode_libc_index.rs,P1-4 修过同义反复断言)在役作替代形态保留。(a) 造双路径开关否决——与「单一路由表」目标正相反,是自费买复杂度。
1.3 Wasmtime 形态 —— 实测裁定:当前不成立(硬结论,无需拍板)
待裁问题:出口分档文档曾声称「.NET 有官方 Wasmtime NuGet 绑定(部署须显式 -W gc)」——Wasmtime 承载 wasm-gc 制品是否成立。
实测证据(2026-10-05 探针④,双臂 + 引擎核心对照):
- .NET + Wasmtime NuGet 48.0.2(dotnet 10.0.401,
tmp/wasmtime_probe/):Config.WithGc(true)开关存在,但编译本仓制品编译期即拒:`support for non-externref and non-funcref references` is not implemented;WithGc(false)臂同错(与开关无关,差距在绑定层)。 - 引擎核心对照(wasmtime CLI v48.0.2):
-W gc下 GC 类型编译通过,错误只停在 instantiate 阶段 import 解析(unknown import: '_::')——引擎核心支持 GC proposal,拒收是 .NET 绑定层的实现差距。 - js-string builtins 提案两侧均无支持(CLI 无旗标、.NET 绑定 API 文档零命中)——本仓制品 3467 条 imports 在 Wasmtime 生态无满足捷径。对照组:Node 25 一行配置(
builtins:['js-string'] + importedStringConstants:'_')16/16 全绿。 - 绑定 API 实况:
Config.WithGc是唯一 GC 相关面(WithWasmGC不存在);Import/Export 面无 builtins 注入口。
判定:Wasmtime 形态当前不成立,.NET 下游现实通道 = 协议 sidecar(serve)或 WebView2 内嵌(Chromium = V8,js-string 原生可用)。触发线保持出口分档 §2 条款:未来真实需求命中再议(绑定层补齐是外部条件,非本仓工程)。出口分档 §2.3 声称已连坐修正。
二、S4 期挂「S9」欠账三条(2026-10-04 重排时漏收,本轮补入并裁定)
| # | 欠账 | 实测状态 | 裁定(2026-10-05) |
|---|---|---|---|
| 1 | names/mangling 发布形态——S4 行原文「发布形态待 S4 收官时裁定:推迟至 S9 后或以白盒锚为发布锚」,现已到期 | C 子集下 type_mangle_suffix/method_mangled_name 的 8 消费点全在 C++ 语法路径,零差分覆盖(实测三 pub 函数 11 调用点全在 parser C++ 面) |
收缩为内部件不进发布面——白盒锚够不上发布锚的证据等级;且契约化标注按函数拆:产名族(ctor_def_name/ctor_call_name)= C# 批预约消费面(CSharp 计划 D2/CS2/§192 三处明文「产名族机制复用、规则简一档」);type_mangle_suffix(C++ 类型 mangling 后缀族)= C++ 死面关联,随摘除批处置(C# 计划明文「无 C++ 重载 mangling 全族」——预期不复用) |
| 2 | containers 预留边界——S4 行「延后 S9」 | ls moonbit/ 实测无 containers 包(24 包无此名)——C-only 下从未有活跃路径 |
归档(默认动作已推进):确认永不建,销掉 F-2 的「包边界预留」 |
| 3 | decl 散拼收口重挂——S4 期坑①「Class__method 散拼,收口随 C++ 片」,C++ 已裁砍零迁移,锚悬空 |
parser/decl.mbt:668 类外方法散拼在("\{func_name}__\{method_tok.text}");补充:118/121 行嵌套类名拼接同病(不经 names 包) |
随死面契约化销案——S9 内零代码改动(§5.2),物理摘除放脱钩后批时散拼随 cpp.mbt/decl 死面一并消失 |
三、裁定批结构性扩充三条
3.1 执行加速出口合并裁定 —— 已裁:合并裁成立
JIT 复核(§1.1 = 不搬)与 wasm-GC 生成器(#41)是同一问题(「执行加速由谁承担」)的两个答案;总计划亦把「wasm-GC 生成器进排期」列为脱钩动手信号之一。裁定:JIT 不搬 + wasm-GC 生成器不进 0.9.0(大件挤占脱钩窗口验证预算);执行加速四形态谱系已补 #41 评论(③④ = AOT 参照系不改 #41 原题——解释循环逐项成本评估仍是主战场)。 口径修正:0.8.0 产出的是判定书素材(性能实录 §14.4 正交性 + §17 跨实现数字),完整判定书即本档 §1.1。
3.2 单侧演化批定序 —— 已裁
#32(analysis M7/M8 重设计)/ #33(Clang fuzz 直拍)/ LIFO v2 / wasm-GC 生成器 / **C++ 死面摘除批(新增候选)**五个候选定序:
- 首个单侧演化批 = #32(小而独立 + S8 已声明收尾,issue #32 在档);
- C++ 死面摘除批 = 第二候选(脱钩后摘除无需 oracle 对照,见 §5.2);
- #33 Clang fuzz 直拍 = 必建项、时机后延(csmith 裁剪工程量;不在工序④准出三件,见 §4.3);
- wasm-GC 生成器与 LIFO v2 后续;wasm-GC 生成器不进 0.9.0。
3.3 MoonBit 停更应急预案 —— 已裁定(2026-10-05 用户拍板):不做预案
裁定理由:①moonc 源码在手(见下),真停更即 fork OCaml 直接维护——应急路径本身足够简单,预案是过度工程;②同一创始人的前作 ReScript 生态在其离开后仍活跃——供应商历史信用正面;③能 fork 维护的范围实测只有 wasm 后端链(见修正后事实),而 Vitro 主出口就是 wasm-gc(完整在手),native 出口本属「可用不承诺」档(出口分档 §1)且其 moonc native 后端未开源、无维护面——主链无险,次链无保价值。 生态实测(2026-10-05,二轮复核修正):moonbitlang/moonbit-compiler 已开源 moonc 前端+中端+wasm 后端(typer.ml 5391 行 / mcore.ml 4893 行真实现;src 共 265 文件;native 后端未开源——Vitro native 出口依赖的该后端是闭源二进制,可 fork/提 PR 面仅 wasm 后端链)。License = relaxed SSPL(README:89 官方自述;SSPL= MongoDB 系,非 GPL/AGPL 家族——LICENSE.TXT 的 GPL 模板骨架 1-18 节是初判误判来源;§14 要求服务化时公开整个服务栈,义务比 AGPL 宽)+ 非商业修改条款(README:92「Modifications to the compiler are allowed for non-commercial purposes」——fork+改编译器受此约束)+ 编译产物 license 自选例外(README:91 / LICENSE.TXT:203-205 双源核实——vitro/engine mooncakes 产物无传染,判定不变)。供应链:moon/core/async = Apache-2.0(API 实测)。残余风险登记:工具链 breaking 无自动化护栏(A8)与 mooncakes 注册表可用性——维持既有工具链升级 skill 与 A8 人工盯通道即可,不另建预案。生态调研详见 moonbit生态参考调研20261005。
四、脱钩工序验收件(已拍板为硬准出——总计划工序③④原文已同步改写;本节是脱钩真风险「防线塌方却没人发现」的对治)
4.1 工序③「golden 自基线」升格:冻结资产清单为显式验收件
工序③原文一句「终验当轮映像/产物固化,KNOWN 转豁免面,J9 证红」无清单。差分防线价值大头在中间产物对拍——固化若只落端到端 stdout,「agent 改坏 codegen 内部形状但端到端恰好不变」类回归全部漏网。实测的将消失差分面(冻结资产清单必须逐面一行:驱动名 + 语料量 + 固化产物形态 + J9 证红方法):
| 差分面 | 现状 | 脱钩后果 | 固化要求 |
|---|---|---|---|
| 四层中间产物 diff(lexer_diff / parser_diff / codegen_diff / vm_diff) | scripts/ 四驱动全家 |
vm_diff 为实时对拍形态、无基线数据文件(仅 known_diffs/skip_list 两规则文件)——oracle 删除即失效,非降级 | 终验当轮 oracle 侧中间产物全量落盘为 golden(601 例四语料) |
| E1–E4 归一产物对拍 | S4 期 598 语料逐字节一致 | 断源 | 同上,随终验固化 |
| teaching 标注 golden | algorithm_annotations_v3.json 311 条 |
固化物本身锚在冻结区(native/tests/golden/) |
迁出冻结区 + 迁移入清单 |
| e2e 三路下落(见 §4.2) | 275 条内联用例 | 断源 | 映射闸复制 host_contract_map 模式 |
| trap 锚面(无 Clang 真值面) | wbtest 锚(vm_exec_wbtest traps 族 7 锚等)+ gateway E3070/E3061 真 trap 锚 | 脱钩后最后防线,前面无任何真值可回退 | 逐锚登记 + 证红义务(突变注入必红;无证红的冻结退化成死锚) |
| shadow / clang_direct 语料差量 | 工序④ clang_direct 吸收 | — | 总计划工序④原文已含(match/known_issue/gap 三口径等价物) |
4.2 e2e 275 条三路下落(修正上轮「clang_direct 承接」的粗糙说法)
- ① 语义点面 ~200 条 → clang_direct 语料承接:用例名与语料六路(baseline 367 + knr 81 + leetcode 138 + gap 17 + codegen_skeleton 13 + 生成模板 82 = 698,规模 2.5×)抽样对得上。执行件:e2e→语料映射闸(复制
scripts/host_contract_map模式——anchored/merged/missing 三态 +--strict收官门,103 条契约先例已在役,勿重复登记契约面)。 - ② trap 语义点(div_by_zero/infinite_loop/null_pointer)→ 语料无对应(实测四目录 grep 零命中):结构性原因 = trap 程序对 Clang 是 UB,Clang 无法作 golden,语料义务链在此类语义上永久失效。对应物是 MoonBit wbtest 锚——归入 §4.1 trap 锚面。
- ③ 契约面 103 条 → host_contract_map 已承接(
--strict时 missing>0 红作收官门,J9 三路自证齐)。 - crash_regression 墓碑对账(窗口自由件,~半天):
crash_regression_tests.rs48 条实测整,去 C++ 面后 C 面约 36 条(INT_MIN mod trap / E3070 strcpy·strcat / free interior·stack pointer / scanf 空白指令五连 / AST 预算六连 / heap quarantine 七连),每条是历史真实 bug 墓碑。产出「墓碑→MoonBit 锚名」映射表入台账,防后续 agent 重蹈历史 bug。 - cabi_smoke 不接:被测物本身是待删 DLL(vitro_native.dll),随 Rust 退役自然消失。
4.3 工序④准出条件(硬准出,非建议——总计划原文已改写):替代建成才许移除
准出三件齐才许执行「CI 移除 Rust 臂」:①冻结资产清单全绿(§4.1)+ ②路 A fuzz 不变量自检建成(Rust fuzz A/B/D/E 的安全检测不变量——UAF 必报 / 1MB 墙必 NULL / 区域表有界——迁 MoonBit VM 确定性随机测试;MoonBit 侧 fuzz 现状为零,能力 100% 锚在 Rust 侧)+ ③3c 结构性替代退役落地(§6 #3)。 路 B(#33 Clang fuzz 直拍)不在准出三件——必建项但时机后延(csmith 裁剪工程量;csmith 已过许可核验〔实机勘探方案表 18:BSD 系仅收生成物〕,开工前置探针 = 子集裁剪可编译率),防工程量卡死脱钩主线。两路分工:路 A 管「对恶意输入必须报错」(安全检测下界),路 B 管「对合法输入必须答对」(语义对拍,Fuzz C 先行——printf/scanf 随机序列在 Rust 侧只验不崩溃,Clang golden 版验输出一致,强度升一档)。
五、增量登记(本轮实测冒出,总计划此前零提及)
- gen_libc_data 第四链:见 §1.2。待办 = #39 补评论登记(外发动作,待授权)。
- MoonBit 侧 C++ parser 死面(2026-10-05 三轮修正定形):F-2 裁「C++ 零迁移」,但 is_cpp_mode 分支整体照搬存活且可编译。精确普查(非测试 .mbt,
is_cpp_mode精确标识符):41 处 = parser 6 文件 39 处(parser.mbt 12 / decl.mbt 8 / type_.mbt 6 / expr.mbt 6 / stmt.mbt 4 / cpp.mbt 3——cpp.mbt 可能整文件摘除)+ diag 2 处纯文档注释;另有数据层尾巴(E4xxx 309 码位经 gen_diag 生成链进 diag 包 + libc/bytecode 放行集内 mangled 名)。裁定(三轮修正:摘除移出 S9):- S9 内 = 契约化标注(零代码改动):①死面清单外置 JSON(41 处按文件/行区间 + 理由「F-2 裁砍零迁移·摘除候选=脱钩后批」)②tripwire 判定脚本机判「清单外不得新增 is_cpp_mode」(J9 证红义务——防死面悄悄生长)③names 按函数拆契约标注(§2#1)。「路线死面」对治:代码死面(is_cpp_mode 挂着)让人以为「C++ 有支持」,与 issue 层路线死面(#33 挂而不改让人以为还活着等认领)同病两位置——前者 tripwire 对治,后者定位改写对治。
- 物理摘除 = 脱钩后单侧演化批(第二候选,§3.2)——摘死面不改 C 语义(C 路径不触达分支),脱钩后无需 oracle 对照、不受固化窗口约束;S9 内摘除若意外触碰公共段会污染工序②终验与工序③固化基线(脆弱期不做重构)。
- 勘误:types.mbt:43 注释「46 处亲证分散」已过时(现 41),契约化时顺带修;上轮宽词表普查 190 处系
Cpp命中 E4xxx 码位文本的口径污染,以 41 处精确口径为准。
六、裁定汇总(终稿——2026-10-05 十项全裁,含「不做会怎样/默认值」分级)
分级:风险组/防线组(#2/#3/#9/#10)= 工序链条硬节点,准出与验收直接引用本表;清扫组(#4/#5+#6)= 默认动作已标注,直接推进不必再等排会。
| # | 决策点 | 裁定 | 不做会怎样 / 默认值 |
|---|---|---|---|
| 1 | JIT 终判 | 不搬(wasm-gc 物理无处放;native 8.8× = Rust 期解释器自相比,正道是修解释器 #41) | 默认值即 F-3 现状,不动零风险;不收口则档案幻象留存(W^X 先例可能被误读为待办) |
| 2 | libc 形态 | 维持双形态 + 路由表(86/2/108 定稿);gen_libc_data↔#39 硬绑定必迁 | 不迁 JSON → 工序④删区 CI 即红(硬绑定兜底,无静默失败形态) |
| 3 | 3c differential_stress | (b) 结构性替代退役;(c) 字节级锚在役保留(libc_pair_anchor_wbtest 88 对硬编码自 Rust 源,P1-4 修过同义反复) |
不裁 → 工序④准出件悬空;移除 Rust 臂后 3c 无退役交代理由 |
| 4 | names 发布形态 | 收缩为内部件 + 按函数拆标注(产名族=C# 预约消费 / mangling 后缀族=随摘除批) | 摘死面不连带标注 → 产名族成零消费孤儿包 |
| 5+6 | decl 散拼 + C++ 死面 | S9 契约化(清单 JSON + tripwire + names 标注,零代码改动);物理摘除 = 脱钩后批(§5.2 三轮修正) | S9 内摘 → 脆弱期重构污染工序②③;不契约化 → 死面持续制造「C++ 有支持」幻觉源 |
| 7 | 演化批定序 | #32 首批;摘除批第二候选;#33 必建时机延后;wasm-GC 生成器/LIFO v2 后续且不进 0.9.0 | 不定序 → 演化批抢跑挤占脱钩窗口验证预算 |
| 8 | 停更应急预案 | 不做预案(真停更即 fork OCaml 维护 wasm 后端链;创始人 ReScript 生态历史信用正面) | 做了 = 过度工程(moonc 源码在手 + 产物例外,主链无险) |
| 9 | fuzz 替代路线 | 两路并建:路 A 不变量自检 = 工序④准出件;路 B #33 Clang fuzz = 脱钩后必建(Fuzz C 先行,csmith 已核验)不在准出内 | 只做 A → 非 UB 语义面(printf/scanf 随机组合空间)永久裸奔;只做 B → 安全检测面无替代即移 Rust 臂 = 防线塌方 |
| 10 | 工序③④升级 | 硬准出:清单逐面一行入工序③ + ④「替代建成才许移除」——总计划原文已改写 | 维持一句「映像固化」→ 中间层回归漏网(codegen 内部形状变而端到端恰好不变) |
探针资产(一次性,用完即弃,git 未入库):tmp/perf_probe/wasm_import_probe.py(手写 wasm 解析,半途废弃——最终形态为 node -e 调 V8 WebAssembly.Module 元数据)、tmp/wasmtime_probe/(.NET 双臂 C# 项目)、tmp/wasmtime-v48.0.2-x86_64-windows/(引擎核心对照 CLI)。
复跑锚:host.js(node scripts/wasm_gateway/host.js,16 断言);libc_single_source(go run ./scripts/moonbit/libc_single_source -check);host_contract_map(go run ./scripts/host_contract_map,--strict 收官门)。