# 长稳与审查核销轮(性能回收 + 长稳承诺 + 12 轮外部审查全量修复)

- **日期**:2026-06-12
- **任务类型**:性能回收 + 长稳加固(freelist/调用深度/GC 根)+ 外部代码审查发现集中核销

## 任务

继完整性补全轮后,提交区间 `3b99d01..8507037` 共 21 个提交:性能回收(`9f0c9cb`,
loop 档 1.84x→2.30x)→ baseenv 补全(`423d690`)→ 豁免注册表(`088533f`)→
LUA_COMPAT_VARARG(`e4556f5`)→ 长稳承诺轮(`62d4bb3` freelist 内存复用 + 调用深度
上限 + GC 根加固;`2eb44fb` 并发验证 + loaded closure 常驻根)→ 集中修复轮
(`95b51a3..8507037` 共 13 个 fix,系统性核销 12 轮逐提交外部代码审查的全部发现)。
审查报告共 13 份,存于 `.code-review/from-f0459d5/`,每项发现均经官方 oracle +
隔离 worktree 探针双向实证。本文只记过程教训,完成明细见 implementation-progress.md。

## 预期 vs 实际

- 预期:在「4 类 go-fuzz + 500 种子差分 + 100 项 probe corpus + GC 压力对照全绿」
  的状态下,外部审查应是确认性动作,产出少量边角发现。
- 实际:12 轮审查共发现 **22+ 项真实问题**,其中 1 个 DoS 级 Go panic(一行脚本崩
  宿主进程,潜伏自 M8)、1 个挂死、若干静默数据损坏——全绿防线对「形式组合空间」
  与「实现与规范的语义同构」两个维度存在结构性盲区,审查是与 fuzz/probe **正交的
  第三轴防线**。

## 做对了什么(可复用模式)

1. **三轴覆盖模型(本轮核心认识,扩展完整性轮的两轴模型)**:fuzz 测「已实现行为的
   自洽」、probe corpus 测「特性面完整性」、逐函数对照官方源码的审查测「实现与规范的
   语义同构」+「形式组合空间」。实证:and-or panic 的触发形式是「短路结果直接参与
   算术」——生成器文法没有此产生式,probe corpus 也没有此形式,只有审查的探针构造
   自由度补上了这个盲区。两轴模型(见完整性轮反思)升级为三轴:**前两轴全绿不构成
   第三轴可省略的理由**。
2. **内存复用类变更的「配套清单」纪律(长稳轮 `62d4bb3` 正确执行)**:freelist 之前
   漏根是良性的(死对象躺在 arena 不被复用),之后同样的漏根 = use-after-free /
   串台执行——**资源复用类变更会把所有潜伏的根管理 bug 从良性升级为致命**。本轮
   配套做齐:GC 根全量审计(resume 链 threadChain、协程 fn/xfer、全部非 dead 协程栈)、
   SETLIST 多值窗后 top 恢复、loaded closure 常驻根(`2eb44fb` 补)、对象尺寸单一
   事实源(`object/size.go`——尺寸错一字 = freelist 错桶 = 相邻对象内存重叠,此前
   同构公式四处手写)。可复用流程:做复用类变更前,先列「哪些 bug 此前良性、之后
   变致命」清单逐项加固;debugFreelist(freeSet/freeSite 双重释放与 UAF 检测)这类
   排障设施应与特性**同批完成**,而非出事后补。
3. **修复轮收尾的「历史 bug 保护测试盘点」**(`8507037`):集中修复结束时,把历次
   发现的 bug 形式逐个固化为 conformance/gcstress 保护测试(infix 求值顺序、pcall
   双返回值、字符串强转、深嵌套护栏、两例随机撞出后定值固化的 freelist UAF)——
   回归不靠再次随机撞中,这是 12 §3.6 纪律在修复轮的执行形式。配套:`c4a4722` 抽
   openMultiRet helper 收口「末位多值源」三处分布——测试加固轮反思预告的回填在此完成。
4. **审查方法论:每个疑点双向验证、不确定不写入**:每个疑似分歧先跑官方 5.1.5
   oracle 确认预期行为,再在对应 commit 的隔离 worktree 跑探针复现,两边都有结论
   才写入报告——13 份报告无一例误报。误报为零是「修复轮可以系统性核销」的前提:
   修复者不需要再花时间甄别真伪。
5. **性能回收手法**(`9f0c9cb`):完整性补全(元方法 + ci 刷新防御)曾把热路径拖慢
   20%(loop 档 2.30x→1.84x);回收方式是「快路径内联进主循环 case、慢路径拆独立
   函数保 doArith 可内联」。该形式(完整性下沉慢路径、热路径只留快判)P2 IC/分层
   会反复用到。

## 什么出了问题 / 根因

1. **全绿状态下潜伏 DoS 级缺陷,审查才暴露**。三个代表:① `(true and 7 or -1) + 1`
   一行脚本 Go panic 崩宿主进程——constFold 丢弃带跳转链的 eKNum,TESTSET A=255
   占位永不回填,潜伏自 M8(修复 `4467881`);② SETLIST 批号溢出 9-bit C 字段回绕,
   25551 项数组字面量 pc 错位死循环挂死(修复 `c4a4722`);③ `table.remove` 越界
   pos 静默删末元素,数据损坏无任何报错(修复 `e5fa433`)。根因同一:fuzz 文法与
   probe corpus 都没有这些形式的产生式——「形式组合空间」是前两轴的共同盲区。
2. **同构必须到时序层,不只到逻辑层(深化 sprint 反思的「同构到 helper 层」)**。
   and-or panic 的根因:官方 lcode.c 在 exp2RK(跳转链合流)**之后**才尝试
   constfolding,本实现把折叠提前到物化之前,制造了「eKNum 带未决跳转链」的非法
   中间态。sprint 反思的「helper 层同构」只覆盖「逻辑分布」维度;本例证明**操作
   顺序本身就是规范**——移植 C 代码时改变语句顺序,须证明交换律成立,否则按原序。
   修复 `4467881` 对齐官方 isnumeral:带跳转链的 eKNum 不可折叠。
3. **「注释承诺审计」缺位:注释声称的防线不存在,就是 bug 预告**。四个实例:
   M5 shadow.go 注释称「配对校验防漏配对」,实现只查范围;M9 rawEqual 注释称
   「走对比 bytes 兜底」,代码直接 return false;errmsg_test 头注释称「行号也单独
   断言一致」,实现把行号丢弃(修复 `70f19f3`);callHost 注释写「保守做法是 top
   不动」——两个里程碑后正是这个「保守」炸出 TFORLOOP 槽被毁(top 纪律本身已录
   测试加固轮反思,本篇深化点是:**注释当时就预告了 bug**)。规律:写下「保守起见
   先不动」「由 X 覆盖」「兜底」字样时,要么立刻实现,要么写成显式 TODO 并入
   doc-gaps——不能让注释比代码乐观。
4. **已知会挂死的复现未加超时护栏**:一次后台探针(已知挂死的 SETLIST 用例)未加
   `-test.timeout`,单核空转 53 分钟才被发现。已知会挂死的复现必须带超时护栏,
   这是审查方法论(上面第 4 条)的反面补丁。

## 缺失的文档或信号

- `docs/design/p1-interpreter/04-frontend-parser-codegen.md` 的同构纪律(doc-gaps
  回填待办第 1 项)只到 helper 层,缺「时序层」条款——constFold 必须在 exp2RK
  之后,`4467881` 是现成反例。
- `06-memory-gc.md` 无「内存复用类变更配套清单」——根审计 / top 纪律 / 尺寸单一
  事实源 / debug 设施同批,长稳轮已实战走通一遍。
- 代码评审无 checklist 文档,「注释承诺审计」这类可机械执行的检查项无处挂靠。
- 12 / engineering.md 的防线综述停留在两轴(生成器 + probe),缺第三轴(外部审查)
  的定位陈述。

## Promotion 候选

- **回填设计文档(并入 doc-gaps 既有「八项合一轮」清单,recorder 执行)**:
  ① 04 增补「同构到时序层」条款(constFold 在 exp2RK 之后,引 `4467881` 反例,
  与既有第 1 项「helper 层同构」并列为两个维度);
  ② 06 增补「内存复用配套清单」(根全量审计 / top 纪律 / 对象尺寸单一事实源 /
  debugFreelist 类排障设施同批完成)。
- **`guides/` 候选**:「注释承诺审计」作为代码评审 checklist 项(grep「保守」「兜底」
  「由 X 覆盖」类措辞,逐条核对实现)——本轮四实例已够立项,若 recorder 评估暂缓,
  留 memory 待下轮评审再验证。
- **防线综述回填**:三轴防线模型(fuzz=行为自洽 / probe=特性面完整性 / review=
  规范同构+形式组合)补入 12-testing-difftest.md 或 engineering.md——与完整性轮
  反思的两轴回填(doc-gaps 第 8 项)合并处理,避免两处各写一半。
- **暂留 memory**:性能回收手法(快路径内联 + 慢路径拆函数保内联,一次实战,P2
  IC/分层再用时验证);审查双向验证纪律(13 份报告零误报,属审查方代码流程,
  本仓库侧只需知道「报告可直接当工单」);53 分钟空转事故(一句话教训,已录本篇)。

## 后续行动

- recorder 把上面两项设计文档回填登记进 doc-gaps「回填待办」清单(八项 → 十项),
  三轴防线综述与既有第 8 项合并措辞。
- P2 新执行层上线时,外部审查轴照搬本轮形式:逐提交或里程碑批次审查 + oracle/
  worktree 双向验证 + 修复轮收尾做历史 bug 保护测试盘点。
- 后续任何 C→Go 移植,statement 顺序与官方不一致处需注释说明交换律依据;无依据
  则按原序。
- 复现已知挂死/死循环用例时,一律带 `-test.timeout`(或等价护栏)再后台执行。
