docs/current/01-定位与路线/工程债务维护方案.md
GitHub ↗
当前有效

Vitro 工程债务偿还维护方案

30764 字·约 77 分钟 阅读 2026-10-10 17:07

最后核对:2026-10-04(全库逐份翻新第三轮——修复追踪引言改指归档〔追踪使命随 Rust 冻结终局〕;任务 E 验收项 wasm32 进 CI 翻绿与 wasm-gc 落地注记随 09-29 批在案。前一沿革 2026-09-27 补 Rust 冻结态注记、D14/D16 销账回填) 本方案基于 2026-06-15 全面评估结果制定,目标是在不破坏现有功能的前提下,系统化偿还工程债务,提升项目长期可维护性。

2026-10-05 删区终局注记:native/ Rust 区已随 S9 工序④物理删除——下条「冻结态注记」所称维护态终止,Rust 侧历史债务(含 D11/D13/D15 活账目)随对象删除终局(载体不存在即无治理对象;条目文本保留为登记史)。MoonBit 活跃区新增债务照旧走总计划 §10.5 G 系列治理;正文大量 native/ 路径与 Rust 条目为历史口径(tag rust-oracle-freeze 可回溯)。 2026-09-27 冻结态注记〔——已被上条删区终局取代〕:native/ Rust 区已冻结为差分对照 oracle(tag rust-oracle-freeze,只收安全修复与防线维护),本方案的 Rust 侧债务治理转入维护态——D14/D16 已于 2026-09-12 重构批次 R4 销账,D11/D13/D15 仍为活账目;新增债务在 MoonBit 活跃区走总计划 §10.5 G 系列治理。§二/§三及以下正文的数字与状态保留 as-of 2026-09-11 口径(逐项现状以各条销账批注为准),历史推进记录一律不改写。本文件继续承载 TODO注释规范.md 依赖的 #DXX 债务编号体系:编号不删除、不重排,消解项保留编号并注明消解原因。

2026-09-11 前端切割口径:CideFlutter/、FRB 桥接(native/src/api/ + frb_generated)、web 部署 workflow 与全部 Flutter 构建脚本已从仓库移除,本仓库转型为纯后端「三出口一核心」(核心 = Rust workspace,出口 = C ABI / wasm32 / vitro_cli serve),决策见 后端定位与白箱计划.md。§二/§三/§四/§五/§六/§八 中凡涉及前端路径或前端任务的条目,均已改写为后端现状或标注「(前端资产,已迁出)」/「已随前端切割消解(2026-09-11)」;§七「修订记录」及所有带日期的历史推进记录一律保持原样,不改写历史。本文件继续承载 TODO注释规范.md 依赖的 #DXX 债务编号体系:编号不删除、不重排,消解项保留编号并注明消解原因。

一、背景与目标

1.1 背景

Vitro 项目已完成 Phase 0 ~ Phase 41 的大规模功能建设,C/C++ 教学子集支持度较高,测试防线基本健全。但在快速迭代过程中积累了以下工程债务:

  • 超大源码文件导致审查与维护成本上升
  • 生成代码与手写源码混管
  • 前端大文件职责过重
  • C++ 扩展模块间耦合度快速上升
  • 部分文档数据口径不一致
  • 缺少项目级 lint 配置
  • 失败记录文件中已修复条目稀释活跃问题

1.2 目标

目标层级 具体目标
P0 消除已识别的文档不一致与生成代码管理问题
P1 拆分超大文件,降低单文件认知负荷
P2 建立项目级 lint 配置与代码内问题追踪机制
P3 优化前端绘制性能与统一模式大状态传递
P4 建立 C++ 扩展模块边界,降低回归风险

1.3 核心原则

  1. 功能优先:所有重构必须保证现有测试防线全绿,禁止以偿还债务为名破坏功能。
  2. 最小侵入:每次变更只处理一个明确的债务点,避免大范围重写。
  3. 诚实记录:重构过程中发现的新问题必须立即记入对应 *_FAILURES.md 或新增 TODO 标记。
  4. 持续集成:任何拆分或重构必须通过 CI 全部 job 验证后方可合并。

二、工程债务清单与优先级

编号 债务项 位置 当前状态 影响 优先级
D01 文档数据口径不一致 README.md / CHANGELOG.md / 审阅报告 ✅ 已统一为 566/569(2026-06-25 实测);当前口径见 §8.1:C Shadow 636/636(2026-09-11) 外部信任损耗 P0
D02 FRB 生成文件仍被追踪 .gitignore 已排除但文件可能仍被 git 追踪 → 对象已随前端切割删除(native/src/api/、native/src/frb_generated.rs、CideFlutter/lib/src/rust/frb_generated*.dart;2026-09-11 复核均不存在) ✅ 已随前端切割消解(2026-09-11) 合并冲突、版本库体积 P0
D03 codegen/expr.rs 过大 crates/vitro_codegen/src/expr.rs(2047 行,已拆分为 8 个子模块并随 vitro_codegen crate 迁移) ✅ 已完成:2047 → 510 行 维护与审查成本高 P1
D04 parser/mod.rs 过大 crates/vitro_parser/src/lib.rs(原 native/src/compiler/parser/mod.rs,2633 行,已拆分并迁移) ✅ 已完成:2633 → 672 行(详见 §六 D04) 维护与审查成本高 P1
D05 host_funcs.rs 过大 crates/vitro_vm/src/host_funcs.rs(2545 行,已拆分并随 vitro_vm crate 迁移) ✅ 已完成:2545 → 155 行(详见 §六 D05) 维护与审查成本高 P1
D06 ide_screen.dart 过大 CideFlutter/lib/screens/ide_screen.dart(896 行)(前端资产,已迁出) ✅ 已随前端切割消解(2026-09-11) 前端维护困难 P1
D07 缺少项目级 clippy 配置 已落地:native/Cargo.toml 的 [lints.clippy] + native/clippy.toml + scripts/lint_check.sh ✅ 已完成(详见 §六 D07) 规则不一致 P2
D08 代码内 TODO/FIXME 标记极少 全项目 ✅ 已新增规范并标记 30+ 处;2026-09-11 实测 Rust TODO/FIXME/HACK 共 10 处 技术债务隐形化 P2
D09 前端 CustomPainter 缺少缓存 CideFlutter/lib/editor/editor_painter.dart 等(前端资产,已迁出) ✅ 已随前端切割消解(2026-09-11) 性能热点 P2
D10 C++ 扩展模块耦合度高 Parser/TypeChecker/CodeGen ✅ 已完成:typeck/cpp/、codegen/cpp/、parser/cpp/ 边界已建立(详见 §六 D10) 回归风险高 P3
D11 失败记录文件稀释 FUZZ_FAILURES.md 等 ⏸️ 保留不动(按用户决策,暂不归档) 活跃问题难定位 P2
D12 Mutex poison 静默恢复 native/src/flutter_bridge.rs(历史会话包装层,重构批次 R2 已整删;问题域结构性消除——现行出口 capi/serve/vitro_cli 均为 &mut Session 独占访问,进程内无共享 Mutex,lock_or_reset/POISON_COUNT 随之退役) ✅ 已完成(详见 §六 D12) 可能掩盖 panic 根因 P3
D13 docs/archive/ 噪音 docs/archive/ ⏸️ 保留不动(按用户决策,暂不清理) 文档噪音 P4
D14 生产代码 unwrap/expect 回升(任务 C 的「0 处」验收标准已不成立) native/crates/vitro_typeck/src/decl.rs(3 处:L44 / L65 init.take().unwrap()、L648 default.clone().unwrap()) ✅ 已收敛(2026-09-12,重构批次 R4 归零——let-else 化,见路线图 G11);曾于 2026-06-25 收敛至 0,后续批次修复期间回升(2026-09-11 复核 3 处) 运行时 panic 风险回升 P2
D15 工程健康度脚本仍带前端时代口径、且门禁未启用 scripts/engineering_health(2026-09-18 由 .py 迁 Go;frb_generated.* 忽略名单、#[cfg(test)] 豁免注释中的 FRB 表述、「Rust/Dart」趋势文案仍在;报告已在 CI 生成并上传 artifact,但无阈值门禁、无红绿判定) ⚠️ 新记(2026-09-11 前端切割核查发现);2026-09-18 迁 Go 后复核口径残留仍在 统计口径漂移无人拦截 P3
D16 单文件超 800 行阈值(任务 B 验收标准已不满足) native/crates/vitro_typeck/src/decl.rs(871 非空行;199 个 .rs 文件中唯一超标者) ✅ 已收敛(2026-09-12,重构批次 R4:拆至 792 非空行 + decl_types.rs);2026-09-11 复核曾超标(批次 G/H 修复后增长) 单文件认知负荷回升 P2

三、阶段规划

第一阶段:清理与对齐(P0,预计 1 周)

目标:消除数据不一致与生成代码管理问题,为后续重构建立干净基线。

任务 1.1:统一 Shadow Verification 数字口径

  • 涉及文件:
    • README.md
    • AGENTS.md
    • CHANGELOG.md
    • native/tests/TEST_REPORT.md
    • reports/three_tier_report.md(如存在)
  • 执行步骤:
    1. 运行 go run ./scripts/shadow_verify 获取最新实测数据。
    2. 运行 go run ./scripts/shadow_verify_cpp 获取最新 C++ 数据(Python 版已随 D5 退役)。
    3. 运行 go run ./scripts/serve_smoke 获取 serve 冒烟断言数(自报口径)。
    4. 统计当前真实匹配数、编译缺口数、运行时缺口数、输出差异数。
    5. 统一所有文档中的数字,注明统计日期与工具版本。
  • 验收标准:所有文档中 Shadow Verification 数字完全一致,CI 不因此报错。
  • 风险:数字更新可能暴露新的未记录差异,需同步更新 *_FAILURES.md。

任务 1.2:将 FRB 生成文件彻底移出版本控制 ✅ 已完成(2026-09-11 随前端切割整体消解)

  • 实际结果(2026-09-11 复核):原「移动出版本控制」的对象已不存在 —— FRB 出口层 native/src/api/、生成物 native/src/frb_generated.rs 已删除,Cargo.toml 移除 flutter_rust_bridge 依赖(native/Cargo.lock 亦无该包);前端侧生成绑定随 CideFlutter/ 一并迁出(标签 before-frontend-split)。因此无需再执行 git rm --cached。
  • 核实记录:
    • Test-Path native/src/api / native/src/frb_generated.rs / CideFlutter → 均为 False;全仓 .dart 文件数为 0。
    • .github/workflows/ 仅剩 ci.yml,且只有 rust 一个 job;deploy_web.yml 已删除。
  • CI 校验口径改写(纯后端三出口):
    1. 出口 3(serve):go run ./scripts/serve_smoke —— 已在 CI(ci.yml「vitro_cli serve smoke (Exit 3 protocol contract)」步骤)。
    2. 出口 1(C ABI):Shadow Verification(C 675 用例 / 匹配 668;C++ 99 用例 / 匹配 95 —— 见 reports/facts.json,as_of 2026-09-15)+ scripts/ci_three_tier_check 带牙齿一致性检查 —— 已在 CI。
    3. 出口 2(wasm32):cargo build --target wasm32-unknown-unknown --release + Node 冒烟 —— ✅ 已进 CI(2026-09-12 重构批次 R4 固化 scripts/wasm_smoke/wasm_smoke.js 并接 ci.yml wasm32 构建/冒烟步骤;见路线图 G2)。
    • 原「CI Rust job 与 Flutter job 均执行 flutter_rust_bridge_codegen generate」的要求作废(无 Flutter job,无 FRB 依赖)。
  • 验收标准(改写后):
    • git ls-files | grep -i frb_generated 无输出(生成物与依赖均已移除)。
    • CI 的 rust job 全绿,含 serve 冒烟与 Shadow 门禁。
    • wasm32 出口检查在 Phase 2a 进 CI 前,由维护者手工执行并在 CHANGELOG.md 记录结果。
  • 风险:无(对象已删除);历史产物可取回 —— 标签 before-frontend-split。

任务 1.3:归档或清理已修复的失败记录条目

  • 涉及文件:
    • FUZZ_FAILURES.md
    • HOST_CONTRACT_FAILURES.md
    • BYTECODE_LIBC_FAILURES.md
    • DIFFERENTIAL_FAILURES.md
    • GOLDEN_FAILURES.md
  • 执行步骤:
    1. 遍历各失败记录文件,识别标记为“已修复”的条目。
    2. 将已修复条目迁移至 docs/archive/failures_archive_2026.md,保留历史轨迹。
      • ⚠️ 2026-09-11 核对:该归档文件至今不存在(docs/archive/ 下无 failures_archive_2026.md), 即本步骤尚未执行,各 *_FAILURES.md 仍同时承载历史与活跃条目——如实记录为此任务的未完成项。
    3. 在活跃失败记录文件中仅保留当前已知失败与边界说明。
    4. 更新 scripts/ci_three_tier_check 的解析逻辑,确保归档后仍能识别历史记录。
  • 验收标准:活跃失败记录文件中至少 70% 条目为当前问题或边界说明;CI 一致性检查通过。
  • 风险:归档过程可能误删仍有效的已知失败,需逐条人工复核。

任务 1.4:完成 ROADMAP_2026_Q3.md 迁移 ✅ 已完成

  • 实际结果(2026-09-11 复核):文件现位于 docs/archive/ROADMAP_2026_Q3.md(Test-Path 为 True),docs/current/ROADMAP_2026_Q3.md 已不存在 —— 迁移已落地,无需再决定存放位置。
  • 验收标准(已满足):git status 不再显示该文件相关未提交状态。

第二阶段:文件拆分与模块化(P1,预计 3 周)

目标:降低超大文件认知负荷,提升模块边界清晰度。

任务 2.1:拆分 crates/vitro_codegen/src/expr.rs

  • 拆分策略:
    • 保留 expr.rs 为入口文件,导出 gen_expr 等公共函数。
    • 按表达式大类拆分为子模块:
      • codegen/expr/literal.rs:字面量、常量、字符串
      • codegen/expr/binary.rs:二元运算、逻辑运算、逗号运算符
      • codegen/expr/unary.rs:一元运算、自增自减、取地址、解引用
      • codegen/expr/call.rs:函数调用、方法调用、函数指针调用
      • codegen/expr/struct.rs:结构体/联合体访问、成员地址
      • codegen/expr/array.rs:数组索引、指针算术
      • codegen/expr/cast.rs:类型转换
      • codegen/expr/new_delete.rs:new/new[]/delete/delete[]
  • 执行步骤:
    1. 提取 gen_expr 内部的 match 分支到各子模块。
    2. 保持 BytecodeGen struct 不变,子模块通过 impl BytecodeGen 添加方法。
    3. 每拆分一个子模块,运行 cargo test --workspace --all-features 验证。
  • 验收标准:
    • expr.rs 行数降至 600 行以内。
    • 所有 Rust 测试通过。
    • Shadow Verification 无新增失败。
  • 风险:拆分时可能破坏 self 可变借用模式,需利用 Rust 借用检查器逐步调整。

任务 2.2:拆分 crates/vitro_parser/src/lib.rs(原 native/src/compiler/parser/mod.rs)

  • 拆分策略:
    • 保留 parser/mod.rs 为模块入口与核心状态机。
    • 按语法结构拆分为子模块:
      • parser/decl.rs:变量声明、函数声明、结构体/联合体/枚举声明
      • parser/stmt.rs:语句解析(if、while、for、switch、return 等)
      • parser/expr.rs:表达式解析
      • parser/type_.rs:类型说明符、声明符、抽象声明符
      • parser/cpp.rs:C++ 专属语法(class、模板、构造析构、引用)
  • 执行步骤:
    1. 将 parse_xxx 方法按主题迁移到子模块。
    2. 在 parser/mod.rs 中 pub use 需要的函数。
    3. 处理 Parser 内部字段访问权限,必要时添加 getter。
  • 验收标准:
    • parser/mod.rs 行数降至 1000 行以内。
    • 所有 Rust 测试通过。
    • C/C++ Shadow Verification 无新增失败。
  • 风险:Parser 内部状态高度耦合,拆分可能暴露隐式依赖,需小步提交。

任务 2.3:拆分 crates/vitro_vm/src/host_funcs.rs(原 native/src/vm/host_funcs.rs)

  • 拆分策略:
    • 保留 host_funcs.rs 为注册入口与公共工具函数。
    • 按功能拆分为子模块:
      • crates/vitro_vm/src/host/memory.rs:malloc/free/realloc/calloc
      • crates/vitro_vm/src/host/string.rs:strlen/strcpy/strcmp/memcpy 等
      • crates/vitro_vm/src/host/io.rs:printf/scanf/fprintf/fgets 等
      • crates/vitro_vm/src/host/file.rs:fopen/fread/fwrite/fclose 等
      • crates/vitro_vm/src/host/math.rs:sin/cos/sqrt/pow 等
      • crates/vitro_vm/src/host/misc.rs:rand/srand/exit/qsort 等
  • 执行步骤:
    1. 将 host 函数按功能迁移。
    2. 提取共享工具如 parse_format_spec、write_memory 到 vm/host/utils.rs。
    3. 更新 host_func_id.rs 与注册逻辑。
  • 验收标准:
    • host_funcs.rs 行数降至 600 行以内。
    • Host Contract 测试、Fuzz 测试、Shadow Verification 全绿。
  • 风险:部分 host 函数共享全局状态(如 VFS、堆管理),拆分需保持状态访问路径一致。

任务 2.4:拆分 CideFlutter/lib/screens/ide_screen.dart(前端资产,已迁出)✅ 已随前端切割消解(2026-09-11)

本条关闭:对象为前端资产,已随 CideFlutter/ 整体迁出(标签 before-frontend-split)。历史成果:896 → 299 行、新增 6 个组件(见 §六 D06 备注)。以下策略与验收标准保留作历史参考,不再推进。

  • 拆分策略:
    • 保留 ide_screen.dart 为页面骨架与布局组合。
    • 将内部组件提取为独立 widget:
      • lib/screens/ide/toolbar.dart:顶部工具栏
      • lib/screens/ide/template_bar.dart:模板栏
      • lib/screens/ide/editor_area.dart:编辑器区域
      • lib/screens/ide/bottom_panel.dart:底部面板
      • lib/screens/ide/floating_orb_area.dart:悬浮球区域
      • lib/screens/ide/keyboard_handler.dart:键盘与快捷键处理
  • 执行步骤:
    1. 识别 ide_screen.dart 中可独立的状态块。
    2. 使用 Consumer/ref.watch 保持状态订阅。
    3. 每提取一个 widget,运行 flutter test 与 flutter analyze 验证。
  • 验收标准:
    • ide_screen.dart 行数降至 300 行以内。
    • flutter analyze 0 issues。
    • 集成测试通过。
  • 风险:拆分过程中可能破坏状态监听链路,需通过集成测试捕获。

第三阶段:规范与质量加固(P2,预计 2 周)

目标:建立项目级 lint 配置、代码内问题追踪机制,优化前端性能热点。

任务 3.1:建立项目级 Clippy 配置

  • 涉及文件:
    • native/Cargo.toml 或新建 native/clippy.toml
    • 各模块源码
  • 执行步骤:
    1. 在 Cargo.toml 中声明 [lints.clippy] 规则,例如:
      • unwrap_used = "deny"
      • expect_used = "warn"
      • missing_panics_doc = "warn"
      • too_many_lines = "warn"
      • type_complexity = "allow"(如现有类型确实复杂)
    2. 逐步修复新增 lint 报错,优先处理高优先级模块。
    3. 对暂时无法修复的地方添加显式 #[allow(...)] 并附注释说明原因。
  • 验收标准:cargo clippy --all-targets -- -D warnings 仍然全绿;新增 lint 规则生效。
  • 风险:unwrap_used 可能导致大量报错,建议先设为 warn,分阶段提升为 deny。

任务 3.2:引入代码内 TODO/FIXME 追踪规范

  • 涉及文件:全项目
  • 执行步骤:
    1. 制定注释规范:
      • // TODO(#<issue>): 说明:已知待改进点
      • // FIXME(#<issue>): 说明:已知缺陷
      • // HACK: 说明:临时 workaround
      • // NOTE: 说明:重要设计决策
    2. 扫描现有代码,补充关键位置的 TODO/FIXME 标记。
    3. 在 CI 或脚本中增加 TODO/FIXME 统计,定期 review。
  • 验收标准:关键 workaround 与边界情况均有代码内标记;维护者可通过 grep 快速定位。
  • 风险:过度标记会制造噪音,应聚焦真正需要跟踪的问题。

任务 3.3:前端 CustomPainter 绘制缓存优化(前端资产,已迁出)✅ 已随前端切割消解(2026-09-11)

  • 涉及文件(均已随 CideFlutter/ 迁出,标签 before-frontend-split):
    • CideFlutter/lib/editor/editor_painter.dart(前端资产,已迁出)
    • CideFlutter/lib/widgets/floating_orb_widget.dart(前端资产,已迁出)
    • CideFlutter/lib/widgets/visualizers/*.dart(前端资产,已迁出)
  • 执行步骤:
    1. 对 TextPainter、ParagraphBuilder、Gradient、Blur 等对象实施缓存,仅在文本/数据变化时重建。
    2. 为动画组件添加 RepaintBoundary 隔离重绘区域。
    3. 使用 shouldRepaint 精确控制重绘。
    4. 在桌面端与移动端分别进行性能测试(观察帧率、CPU 占用)。
  • 验收标准:
    • 复杂可视化场景下帧率不低于 55fps。
    • flutter test 与集成测试通过。
  • 风险:缓存逻辑引入状态同步复杂度,需确保数据更新时正确失效。

任务 3.4:统一模式大状态传递优化

2026-09-11 口径:本条后端侧仍有效(StepPayload 字段瘦身、符号表/变量历史增量更新由 vitro_runtime 与 unified::stream 承担);Dart 侧条目已随前端切割迁出并冻结。

  • 涉及文件:
    • native/src/api/vitro.rs(已随前端切割移除,出口改由 native/src/capi/ + native/src/session_api.rs 承担)
    • native/src/flutter_bridge.rs(仍存在:历史会话包装层,被 vitro_cli 消费,名称待后续重构收敛)
    • CideFlutter/lib/providers/unified_notifier.dart(前端资产,已迁出)
  • 执行步骤:
    1. 评估当前 StepPayload/StepPayloadDelta 字段必要性,剔除冗余字段(后端,仍有效)。
    2. 对符号表、变量历史等大对象启用增量更新或分页(后端,仍有效)。
    3. 在 Dart 端使用 compute 或 isolate 处理大状态反序列化(前端资产,已迁出,条目关闭)。
    4. 增加状态大小日志,监控异常增长(后端,仍有效)。
  • 验收标准:
    • 10 万步统一模式下后端吞吐与内存表现有界(原「前端仍保持流畅」为前端指标,随前端迁出不再由本仓验收)。
    • 内存占用无明显增长。
  • 风险:增量更新逻辑复杂,可能引入状态不一致。

第四阶段:C++ 扩展模块化(P3,预计 4 周)

目标:降低 C++ 扩展在 Parser/TypeChecker/CodeGen 中的耦合度,减少回归风险。

任务 4.1:建立 C++ 语法专属解析模块

  • 涉及文件:
    • crates/vitro_parser/src/cpp.rs(新建)
    • crates/vitro_parser/src/lib.rs
  • 执行步骤:
    1. 将 C++ class、模板、构造析构、引用等语法解析逻辑集中到 parser/cpp.rs。
    2. 在 parser/mod.rs 中通过 parse_cpp_xxx 调用入口。
    3. 保持 C 解析路径不被 C++ 逻辑污染。
  • 验收标准:C 解析模块中不出现 Class、Template、Reference 等 C++ 专属分支。

任务 4.2:建立 C++ 类型检查模块边界

  • 涉及文件:
    • crates/vitro_typeck/src/cpp/
    • crates/vitro_typeck/src/lib.rs
  • 执行步骤:
    1. 将 C++ 类布局、方法解析、重载、引用语义迁移到 typeck/cpp/ 子模块。
    2. 明确 C++ typeck 与 C typeck 的调用边界。
    3. 提取公共工具函数到 typeck/cpp/utils.rs。
  • 验收标准:typeck/mod.rs 对 C++ 逻辑的依赖通过明确接口完成。

任务 4.3:建立 C++ 字节码生成模块边界

  • 涉及文件:
    • crates/vitro_codegen/src/cpp/
    • crates/vitro_codegen/src/expr.rs / stmt/
  • 执行步骤:
    1. 将 C++ 构造析构调用、方法调用、引用处理、移动构造等逻辑迁移到 codegen/cpp/。
    2. 在通用 gen_expr/gen_stmt 中通过类型判断分派到 C++ 处理模块。
  • 验收标准:C++ 代码生成变更不再扩散到通用表达式生成逻辑。

任务 4.4:C++ 容器布局维护流程固化

  • 涉及文件:
    • native/runtime_libc/vitro/*.cpp
    • scripts/extract_cpp_builtin_layout.py
    • crates/vitro_cpp_frontend/src/builtin_layout_data.json
  • 执行步骤:
    1. 文档化容器新增流程:编辑 .cpp → 运行提取脚本 → 验证 JSON → 跑测试。
    2. 在 CI 中增加 .cpp 接口声明的语法检查(clang++ -fsyntax-only)。
    3. 确保 Rust 代码中不再新增硬编码容器信息。
  • 验收标准:新增容器必须仅修改 .cpp 与脚本,无需改动 Rust 源码。

第五阶段:长期健康度维护(P4,持续推进)

目标:保持文档整洁、监控工程健康度、持续消除小额债务。

任务 5.1:定期清理 docs/archive/

  • 执行步骤:
    1. 每季度 review docs/archive/,删除无价值的历史交互文本。
    2. 对保留的归档文档添加摘要说明,便于后续检索。
  • 验收标准:docs/archive/ 体积季度环比下降或保持稳定。

任务 5.2:建立工程健康度看板 ✅ 已完成

  • 执行步骤:
    1. 新增 scripts/engineering_health.py 健康度看板脚本,统计以下指标:
      • 各 Rust 源文件行数 Top 20(Dart 项随前端切割归零:脚本现只扫描 native/src 与 native/crates,仓库内 .dart 文件数为 0)
      • TODO/FIXME/HACK 数量(按文件分布 Top 10)
      • unwrap/expect 使用数量(按文件分布 Top 10)
      • 失败记录文件中活跃问题数量
      • Shadow Verification 匹配率(C / C++)
    2. 生成报告到 reports/engineering_health.md。遗留问题(新记为 D15):脚本仍保留前端时代残留(frb_generated.* 忽略名单、豁免注释中的 FRB 表述、「Rust/Dart」趋势文案)——2026-09-18 迁 Go(scripts/engineering_health)后复核仍在;报告已由 CI 生成并上传 artifact,但阈值门禁未启用(无红绿判定),待后续清理。
  • 验收标准:维护者可定期查看工程健康度趋势。

任务 5.3:Mutex poison 处理增强

  • 涉及文件:native/src/flutter_bridge.rs(历史会话包装层,被 vitro_cli 消费,名称待后续重构收敛;仍存在于本仓,非前端资产)
  • 执行步骤:
    1. 在 poison 恢复路径增加日志记录。
    2. 评估是否需要 panic 而非恢复默认值。
    3. 增加指标或测试覆盖 poison 场景。
  • 验收标准:poison 不再静默恢复,至少留下可观测痕迹。

四、执行节奏与里程碑

阶段 时间 里程碑 关键交付物
第一阶段 第 1 周 基线清理完成 文档数字一致、FRB 生成物随前端切割移除(原「移出版本库」目标已升级为整体删除)、失败记录归档、工作区干净
第二阶段 第 2~4 周 超大文件拆分完成 expr.rs/parser/mod.rs/host_funcs.rs 行数达标;ide_screen.dart 一项已随前端切割消解(前端资产,已迁出)
第三阶段 第 5~6 周 规范与性能加固完成 项目级 clippy 配置生效、TODO 规范落地;前端绘制性能优化已随前端切割消解(前端资产,已迁出)
第四阶段 第 7~10 周 C++ 扩展模块化完成 C++ Parser/TypeChecker/CodeGen 边界清晰、容器布局流程固化
第五阶段 持续 健康度维护常态化 季度 archive 清理、工程健康度看板

五、质量保证

5.1 每个任务必须通过的验证

  1. 单元测试:cd native && cargo test --workspace --all-features 全绿。
  2. Lint:cargo clippy --all-targets -- -D warnings 全绿。
  3. 格式化:cargo fmt --check 通过。
  4. Shadow Verification:C/C++ Shadow Verification 无新增失败。
  5. 出口 3 协议冒烟:go run ./scripts/serve_smoke 通过(CI 已执行)。
  6. 出口 2 构建:cargo build --target wasm32-unknown-unknown --release 通过(Phase 2a 起进 CI)。
  7. 集成测试:CI 全量 workflow 通过。

5.2 变更管理

  • 每个任务独立分支,禁止混合无关变更。
  • 每个 PR 必须关联本方案中的债务编号(如“偿还 D03”)。
  • PR 描述中必须说明:变更范围、测试验证结果、已知风险。

5.3 回退策略

  • 若拆分过程中发现功能回退,立即停止拆分,回滚到上一个稳定提交。
  • 若新增 lint 规则导致大量报错,先降级为 warn,分阶段修复。
  • 若 wasm32 出口构建失败,先确认目标已安装(rustup target add wasm32-unknown-unknown)与 #[cfg(target_arch = "wasm32")] 门控未被破坏;历史前端构建(Flutter/Android)的回退策略随前端迁出,需要时从标签 before-frontend-split 取回脚本。

六、附录:债务追踪表

编号 债务项 阶段 状态 负责人(角色) 备注
D01 文档数据口径不一致 一 ✅ 已完成 文档维护者 2026-06-25 实测统一为 566/569
D02 FRB 生成文件管理 一 ✅ 已随前端切割消解(2026-09-11) CI/构建维护者 对象已删除:native/src/api/、native/src/frb_generated.rs、Cargo.toml 的 flutter_rust_bridge 依赖;原「提交 ab39aaa 改为构建时生成」的方案随 FRB 一并作废;历史见标签 before-frontend-split
D03 codegen/expr.rs 过大 二 ✅ 已完成 编译器维护者 2047 → 510 行;新增 8 个子模块;后续补充拆分 vitro_lexer/src/lib.rs 1022 → 403 行
D04 parser/mod.rs 过大 二 ✅ 已完成 编译器维护者 2633 → 672 行;新增 5 个子模块
D05 host_funcs.rs 过大 二 ✅ 已完成 VM 维护者 2545 → 155 行;新增 7 个子模块
D06 ide_screen.dart 过大 二 ✅ 已随前端切割消解(2026-09-11) 前端维护者 历史成果「896 → 299 行;新增 6 个组件」随 CideFlutter/ 迁出(标签 before-frontend-split),本仓已无该文件
D07 缺少项目级 clippy 配置 三 ✅ 已完成 Rust 维护者 新增 [lints.clippy] + clippy.toml + scripts/lint_check.sh
D08 TODO/FIXME 标记极少 三 ✅ 已完成 全团队 新增 docs/current/04-标准库与防线/TODO注释规范.md,源码标记 30+ 处
D09 CustomPainter 缺少缓存 三 ✅ 已随前端切割消解(2026-09-11) 前端维护者 历史成果「Array/Tree/LinkedList Visualizer 缓存 parsed numbers 与 TextPainter;shouldRepaint 精确化;RepaintBoundary 隔离」随前端迁出,本仓已无 *_visualizer.dart
D10 C++ 扩展模块耦合度高 四 ✅ 已完成 C++ 扩展维护者 已建立 typeck/cpp/、codegen/cpp/、parser/cpp/ 边界;class 构造/引用/RAII、RangeFor、template、类外方法/静态字段均已下沉
D11 失败记录文件稀释 一 ⏸️ 保留不动 测试维护者 按用户决策,暂不归档
D12 Mutex poison 静默恢复 五 ✅ 已完成 桥接维护者 增加 #[track_caller]、全局 POISON_COUNT 计数、调用位置日志;对象已随重构批次 R2(2026-09-11)整删 —— 全局会话单例结构性消除,vitro_cli 改直用本地 Session + session_api,POISON_COUNT 随之退役
D13 docs/archive/ 噪音 五 ⏸️ 保留不动 文档维护者 按用户决策,暂不清理
D14 生产代码 unwrap/expect 回升 三 ✅ 已收敛(2026-09-12,R4 归零) Rust 维护者 2026-09-11 复核曾为 native/crates/vitro_typeck/src/decl.rs 的 L44 / L65 / L648 三处;2026-09-12 重构批次 R4 let-else 化归零(路线图 G11 ✅),任务 C 的「0 处」验收标准恢复成立
D15 工程健康度脚本前端残留 + 无门禁 五 ⚠️ 新记(2026-09-11) 构建维护者 scripts/engineering_health 的 frb_generated.* 忽略名单与「Rust/Dart」文案待清理(2026-09-18 由 .py 迁 Go,复核残留仍在);reports/engineering_health.md 已由 CI 生成并上传 artifact,但阈值门禁未启用
D16 单文件超 800 行阈值(decl.rs 871 行) 二 ✅ 已收敛(2026-09-12,R4 拆分) 编译器维护者 任务 B 的「每个源文件 ≤800 行」验收标准曾不满足(199 个 .rs 文件中仅 decl.rs 超标 871 非空行);2026-09-12 重构批次 R4 拆至 792 非空行 + decl_types.rs(路线图 G11 ✅)

七、修订记录

日期 版本 修订内容 修订人
2026-06-15 1.0 初始版本 代码审查 Agent
2026-06-16 1.1 完成 P0 清理对齐;完成 P1 超大文件拆分(expr.rs/parser/mod.rs/host_funcs.rs/ide_screen.dart) 维护 Agent
2026-06-16 1.2 启动 P2 规范与质量加固(clippy 配置、TODO 规范、CustomPainter 缓存、统一模式状态优化) 维护 Agent
2026-06-16 1.3 完成 P2 四任务:clippy 配置、TODO/FIXME 规范、CustomPainter 缓存、统一模式大状态优化 维护 Agent
2026-06-16 1.4 推进 P3/P5:建立 typeck/cpp/、codegen/cpp/、parser/cpp/ 初步边界;修复 D12 Mutex poison 可观测性 维护 Agent
2026-06-16 1.5 继续推进 D10:RangeFor 生成下沉、parser 构造/静态字段解析下沉 维护 Agent
2026-06-16 1.6 完成 D10:VarDecl class/引用/RAII、parser class/template 顶层分发全部下沉到 cpp/ 子模块 维护 Agent
2026-06-16 1.7 推进 P5:新增 scripts/engineering_health.py 工程健康度看板脚本;shadow_verify.py 同步更新 *_latest.* 文件;生成首份 reports/engineering_health.md 维护 Agent
2026-06-17 1.8 基于全面评估追加后续计划:架构拆分、unwrap 收敛、失败记录口径整理、CI 加固、性能收尾 评估 Agent
2026-06-17 1.9 推进任务 D:统一失败记录统计口径为 KNOWN_FAILURE/DIVERGENCE/LIMITATION;修正 CPP_FAILURES.md 用例数 60→61;KR_FAILURES.md 明确当前 0 活跃失败;更新 engineering_health.py 与首份新口径报告 维护 Agent
2026-06-17 2.0 完成任务 C:澄清生产代码 unwrap/expect 口径为 17 处;engineering_health.py 新增生产代码/测试代码/生成代码区分统计;Cargo.toml 将 unwrap_used 提升为 deny;lib.rs 更新豁免注释;cargo test --all-features / clippy / fmt 全绿 维护 Agent
2026-06-17 2.1 推进任务 B:拆分 compiler/lexer.rs(1608 → 655 行),新增 lexer/token.rs、keyword.rs、number.rs、string.rs、comment.rs、preprocessor.rs 子模块;Lexer 字段改为 pub(crate) 以支持跨模块 impl 维护 Agent
2026-06-17 2.2 推进任务 B:拆分 compiler/ast.rs(1253 → 76 行),新增 ast/types.rs、expr.rs、stmt.rs、decl.rs 子模块;通过 pub use 保持外部 API 不变 维护 Agent
2026-06-17 2.3 推进任务 B:拆分 compiler/typeck/mod.rs(1326 → 485 行),新增 typeck/context.rs、typeck/convert.rs、typeck/init.rs、typeck/symbols.rs;TypeChecker 字段可见性调整为 pub(crate) 维护 Agent
2026-06-17 2.4 推进任务 B:拆分 unified/algorithm_steps.rs(1439 → 170 行),新增 algorithm_steps/sorting.rs、graph.rs、tree.rs、structures.rs、search.rs、math.rs、dp.rs 维护 Agent
2026-06-17 2.5 推进任务 B:拆分 vm/core/executor.rs(1601 → 451 行),新增 executor/arithmetic.rs、memory.rs、control.rs、float.rs、stack.rs、debug.rs 维护 Agent
2026-06-17 2.6 推进任务 B:拆分 compiler/parser/expr.rs(1170 → 50 行),新增 parser/expr/ops.rs、unary.rs、postfix.rs、primary.rs 维护 Agent
2026-06-17 2.7 推进任务 B:拆分 compiler/typeck/expr.rs(1162 → 183 行),新增 typeck/expr/ops.rs、literal.rs、var.rs、call.rs、cast.rs、cpp.rs 维护 Agent
2026-06-17 2.8 推进任务 B:拆分剩余三个超大文件——compiler/algorithm_detector.rs(1145 → 44 行入口)拆分为 8 个算法类别子模块;vm/core/mod.rs(1221 → 30 行入口)拆分为 state.rs/memory.rs/snapshot.rs;compiler/codegen/mod.rs(1148 → 759 行)拆分为 func.rs/init.rs/tests.rs;cargo test / clippy / fmt / C/C++ Shadow Verification 全绿 维护 Agent
2026-06-17 2.9 完成任务 B:拆分 compiler/codegen/stmt.rs(884 → 85 行入口),新增 stmt/var_decl.rs、stmt/control.rs、stmt/switch.rs、stmt/block.rs、stmt/expr_stmt.rs、stmt/cpp.rs;cargo test --all-features / clippy / fmt 全绿,C Shadow Verification 505/511,C++ Shadow Verification 83/83 无新增失败 维护 Agent
2026-06-17 3.0 完成任务 D:失败记录文件口径整理。修复 CPP_FAILURES.md 中嵌入的 NUL 字节;将 cases_golden/GOLDEN_FAILURES.md 纳入活跃失败统计并标注 KNOWN_DIVERGENCE;修正 engineering_health.py 中不存在的 native/tests/GOLDEN_FAILURES.md 路径;重新生成 engineering_health.md,活跃失败记录口径统一为 14 条 维护 Agent
2026-06-17 3.1 推进任务 E:CI 与构建系统加固。scripts/build_flutter.py --test 改为 cargo test --all-features 与 cargo clippy --all-targets -- -D warnings;CI Rust job 同步使用 cargo test --all-features;新增 scripts/patch_flutter_windows_generator.py 脚本化 Flutter CMAKE_GENERATOR patch;Android job 增加 flutter test;Cargo.toml 锁定 serde/serde_json/libm 小版本 维护 Agent
2026-06-17 3.2 推进任务 F:性能收尾。Visualizer 缓存落地:array_visualizer.dart 缓存 parsed numbers;tree_visualizer.dart 与 linked_list_visualizer.dart 将 TextPainter 创建上提到 State 并复用,通过 saveLayer 应用动态透明度;unified_notifier.dart 增加 frameCache 5000 帧上限兜底。统一模式差分编码:变量级差分、Dart isolate 解码、大 batch 阈值已在位;数组/指针/调用栈全字段差分仍有剩余工作 维护 Agent
2026-06-17 3.3 完成任务 F 剩余差分编码:unified::stream::StepPayloadDelta 对 call_stack/vis_events/accessed_vars 使用 Option<Vec<T>> 差分;array_snapshots/pointer_snapshots 实现按名索引的新增/替换/删除差分;Dart 端 UnifiedNotifier 同步应用差分;新增 Rust 单元测试覆盖 roundtrip;C Shadow Verification 505/511、C++ Shadow Verification 83/83 无新增失败 维护 Agent
2026-06-17 3.4 拆分 unified/stream.rs(948 → 490 行),新增 stream/encode.rs、stream/decode.rs、stream/diff.rs,保持 encode_payloads/decode_batch 公共入口不变;cargo test --all-features / clippy / fmt / C/C++ Shadow Verification / flutter test 全绿 维护 Agent
2026-06-17 3.5 启动任务 A:Workspace 拆分。native/Cargo.toml 增加 [workspace];新增 crates/vitro_shared(SourceLoc)与 crates/vitro_ast(AST 节点/类型系统);compiler/mod.rs 与 shared/mod.rs 通过 pub use 保持既有路径兼容;cargo test --all-features / clippy / fmt / C Shadow Verification 505/511 / C++ Shadow Verification 83/83 / flutter test 全绿 维护 Agent
2026-06-17 3.6 尝试拆分 vitro_diagnostics 独立 crate:因 FRB 在 vitro_native 中为外部 crate 类型生成 IntoIntoDart 实现触发孤儿规则(orphan rules)而回退;diagnostics 仍保留在 vitro_native 内部,待 FRB 类型处理策略明确后再迁移 维护 Agent
2026-06-18 3.7 推进任务 G:新增 5 道 LeetCode 中等题(lc_3 / lc_33 / lc_48 / lc_62 / lc_64);修复 JIT 统计信息污染 stdout 问题,新增 vitro_get_jit_stats C API;文档 Shadow Verification 数字统一更新为 509/516;C/C++ Shadow Verification 全绿 维护 Agent
2026-06-18 3.8 继续推进任务 G:新增 5 道 LeetCode 中等题(lc_2 / lc_11 / lc_19 / lc_31 / lc_34);文档 Shadow Verification 数字统一更新为 515/521;C/C++ Shadow Verification / cargo test --all-features / flutter test 全绿 维护 Agent
2026-06-18 3.9 继续推进任务 G:新增 5 道 LeetCode 中等题(lc_15 / lc_39 / lc_46 / lc_75 / lc_198);文档 Shadow Verification 数字统一更新为 520/526;C/C++ Shadow Verification / cargo test --all-features / flutter test 全绿 维护 Agent
2026-06-18 4.0 继续推进任务 G:新增 5 道 LeetCode 中等题(lc_55 / lc_142 / lc_152 / lc_200 / lc_221);文档 Shadow Verification 数字统一更新为 525/531;C/C++ Shadow Verification / cargo test --all-features / flutter test 全绿 维护 Agent
2026-06-18 4.1 继续推进任务 G:新增 5 道 LeetCode 中等题(lc_49 / lc_56 / lc_78 / lc_102 / lc_139);文档 Shadow Verification 数字统一更新为 530/536;C/C++ Shadow Verification / cargo test --all-features / flutter test 全绿 维护 Agent
2026-06-18 4.2 完成任务 G:all in 填充最后 5 道 LeetCode 中等题(lc_153 / lc_162 / lc_300 / lc_394 / lc_560),中等题达到 30 道上限;文档 Shadow Verification 数字统一更新为 535/541;C/C++ Shadow Verification / cargo test --all-features / flutter test / 三层契约检查全绿 维护 Agent
2026-06-18 4.3 继续 all in 填充 LeetCode:新增 15 道混合难度题(lc_4 / lc_23 / lc_25 / lc_42 / lc_45 / lc_53 / lc_73 / lc_76 / lc_84 / lc_91 / lc_98 / lc_124 / lc_146 / lc_207 / lc_322),含 7 道困难题、7 道中等题、1 道简单题;诚实记录 lc_4 实现中发现 Vitro 函数返回 double 值异常(输出 0.0)的行为差异,已改用整数返回值实现并通过;文档 Shadow Verification 数字统一更新为 549/555;C/C++ Shadow Verification / cargo test --all-features / flutter test / 三层契约检查全绿 维护 Agent
2026-06-18 4.4 推进任务 G:新增 K&R 第 7 章 7 个用例(kr_7_1~kr_7_7),K&R 防线扩展至 76/76;新增 C++ 教学知识卡片 E4100~E4104;扩展 学生错误用例集.md C++ 常见错误章节;Shadow Verification 数字更新为 555/562;cargo check / e2e / Shadow Verification 全绿 维护 Agent
2026-06-18 4.5 推进任务 A:Workspace 拆分。新增 crates/vitro_runtime(运行时共享数据:func_meta/symbol/type_utils、RuntimeState/MemoryState、内存布局常量、unified 基础数据);新增 crates/vitro_vm(完整迁移 native/src/vm/);native/src/vm/ 删除,vitro_native 通过 pub use vitro_vm as vm; 保持路径兼容;引入 VmContext 替代 Session 上帝对象;修复测试文件中的 VM 调用签名;cargo test --all-features / cargo clippy --all-targets -- -D warnings / cargo fmt --check / C Shadow Verification 555/562 / C++ Shadow Verification 83/83 / flutter test 全绿 维护 Agent
2026-06-18 4.6 继续推进任务 A:新增 crates/vitro_lexer。将 ErrorCode 下沉到 crates/vitro_shared;将 native/src/compiler/lexer.rs 与 native/src/compiler/lexer/ 子模块完整迁移到 crates/vitro_lexer;native/src/compiler/mod.rs 通过 pub use vitro_lexer as lexer; 保持路径兼容;native/src/compiler/lexer.rs 与 native/src/compiler/lexer/ 删除;cargo test --all-features / cargo clippy --all-targets -- -D warnings / cargo fmt --check / C Shadow Verification 555/562 / C++ Shadow Verification 83/83 全绿 维护 Agent
2026-06-18 4.7 继续推进任务 A:新增 crates/vitro_parser。将 native/src/compiler/parser/ 全部 10 个文件完整迁移到 crates/vitro_parser;vitro_shared 新增 SourceLoc re-export;vitro_native 通过 pub use vitro_parser as parser; 保持路径兼容;native/src/compiler/parser/ 删除;cargo test --all-features / cargo clippy --all-targets -- -D warnings / cargo fmt --check / C Shadow Verification 555/562 / C++ Shadow Verification 83/83 全绿 维护 Agent
2026-06-18 4.8 继续推进任务 A:新增 crates/vitro_cpp_frontend 与 crates/vitro_typeck。将 vm::host_func_id/vm::bytecode_libc_index/vm::bytecode_libc_sig 下沉到 vitro_runtime;将 native/src/compiler/cpp_frontend/ 完整迁移到 crates/vitro_cpp_frontend;将 native/src/compiler/typeck/ 全部 22 个文件完整迁移到 crates/vitro_typeck;TypeChecker 新增 pub fn new(is_library_mode: bool) 构造函数以解决跨 crate 私有字段访问;vitro_native 通过 pub use vitro_cpp_frontend as cpp_frontend; / pub use vitro_typeck as typeck; 保持路径兼容;cargo test --all-features / cargo clippy --all-targets -- -D warnings / cargo fmt --check / C Shadow Verification 555/562 / C++ Shadow Verification 83/83 全绿 维护 Agent
2026-06-18 4.9 完成任务 A 关键节点:新增 crates/vitro_codegen。将 native/src/compiler/codegen/ 全部 26 个文件完整迁移到 crates/vitro_codegen;将 vitro_vm::opcode/vitro_vm::instruction 及内存布局常量下沉到 vitro_runtime,切断 codegen 对 vitro_vm 的直接依赖;vitro_native 通过 pub use vitro_codegen as codegen; 保持路径兼容;修复迁移过程中 vitro_vm 测试对 Session 的残留依赖,改为 VmContext;文档测试基线更新为 cargo test --workspace --all-features 750 passed;cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / C Shadow Verification 555/562 / C++ Shadow Verification 83/83 全绿 维护 Agent
2026-06-18 4.10 继续推进任务 A 评估:unified/engine/api 三个模块因 FRB 孤儿规则与 Session 耦合暂无法独立成 crate;诚实记录该架构限制,并更新任务 G 中 K&R 第 8 章的评估结论 维护 Agent
2026-06-19 4.11 继续推进任务 A:新增 crates/vitro_algorithm_steps,将 native/src/unified/algorithm_steps/ 完整迁移为独立 crate;通过 AlgorithmContext trait 解耦对 Session 的依赖;vitro_native 通过 pub use vitro_algorithm_steps as algorithm_steps; 保持路径兼容;cargo test --workspace --all-features / clippy / fmt / C Shadow Verification 555/562 / C++ Shadow Verification 83/83 全绿 维护 Agent
2026-06-19 4.12 继续推进任务 A:将 native/src/unified/checkpoint.rs 的 CheckpointManager 迁移到 vitro_vm::snapshot;重构 should_checkpoint/save 签名去除 Session/StepMeta 依赖;更新 unified/engine.rs、flutter_bridge.rs、bin/vitro_cli.rs、tests/test_snapshot.rs 调用点;删除 native/src/unified/checkpoint.rs;验证全绿 维护 Agent
2026-06-19 4.13 推进任务 F:完成后端 10 万步性能基线实测;新增 UnifiedEngine::with_max_steps 与 vitro_cli unified --max-steps 选项;新增 native/benches/unified_perf_baseline.c 与 scripts/unified_perf_baseline.py,生成 reports/unified_perf_baseline.md;前端 55fps 回放基线仍待 Flutter 桌面端实测 维护 Agent
2026-06-19 4.14 维护计划收尾:P1 完成前端 55fps 实测(Release 桌面端 40 元素冒泡排序回放等效 FPS 825.1,报告 reports/frontend_fps_baseline.md);P2 在 CHANGELOG.md [Unreleased] 补录 Workspace 模块化拆分;P3 统一 unwrap/expect 口径为生产代码 17 处;P4 拆分 native/src/diagnostics/error_catalog.rs(968→455 行)为 error_catalog/{lexer,parser,semantic,cpp}.rs;P5 在 学生错误用例集.md 新增 7.3 union 成员误读用例;P6 明确 vitro_engine/vitro_api 因 FRB 孤儿规则与 Session 耦合暂缓拆分;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter test / flutter analyze 全绿 维护 Agent
2026-06-19 4.15 推进任务 B:拆分 native/crates/vitro_typeck/src/builtin.rs(1034 → 336 行),新增 builtin/memory.rs、builtin/string.rs、builtin/io.rs、builtin/file.rs、builtin/math.rs;visit_call 分派与 parse_format_specs/check_printf_format/check_scanf_format 保留在入口文件;所有 builtin 检查方法提升为 pub(crate) 以支持跨模块 impl 调用;cargo test --workspace --all-features(750 passed)/ cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / C Shadow Verification 555/562 / C++ Shadow Verification 83/83 全绿 维护 Agent
2026-06-19 4.16 完成任务 B:拆分 CideFlutter/lib/widgets/custom_keyboard.dart(991 → 12 行入口),使用 Dart part 机制新增 keyboard/layout.dart(核心状态与 build)、keyboard/letters.dart(字母模式 extension)、keyboard/numbers.dart(数字模式 extension)、keyboard/symbols.dart(符号模式 extension)、keyboard/gestures.dart(_KeyButton/_LetterKey);将 _setSymbolCategory 下沉到 _CustomKeyboardState 内部以符合 setState 的 @protected 规则;flutter analyze 0 issues / flutter test 221 passed / cargo check --workspace --all-features 全绿 维护 Agent
2026-06-19 4.17 修复已知限制:fputs(str, stdout) 无输出。crates/vitro_vm/src/host/file.rs 的 host_fputs 识别 lexer 预定义的 stdout(1)/stderr(2) 宏 fd,将字符串直接追加到 RuntimeState.output_lines;普通 FILE* 文件流写入行为不变;新增 test_e2e_fputs_stdout 回归用例;同步更新 AGENTS.md 已知限制与 CHANGELOG.md [Unreleased];cargo test --workspace --all-features(751 passed)/ cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / C Shadow Verification 555/562 / C++ Shadow Verification 83/83 全绿 维护 Agent
2026-06-19 4.18 更新维护计划:第八章评估结论摘要刷新为当前状态(任务 B 已完成、fputs(stdout) 已修复);任务 B 标记为 ✅ 已完成;新增任务 H"AGENTS.md 已知限制逐项修复",建立 10 项限制跟踪清单;里程碑表格追加任务 H 条目;同步更新主要短板描述 维护 Agent
2026-06-25 4.19 推进任务 H:修复函数返回 double 值异常(H07)。根因是 return 语句未对返回值表达式插入隐式类型转换;vitro_typeck::decl.rs 在 check_assignable 成功后调用 insert_implicit_cast;新增 baseline/float_func_return.c 回归用例;lc_4.c 恢复为原始 double 返回实现;同步更新 AGENTS.md、LEETCODE_FAILURES.md、CHANGELOG.md [Unreleased];C Shadow Verification 更新为 556/563,C++ Shadow Verification 保持 83/83;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿 维护 Agent
2026-06-25 4.20 推进任务 H:修复 scanf/sscanf 的 %s 格式符不支持(H08)。crates/vitro_vm/src/host/io.rs 的 host_scanf_n/host_sscanf 新增 's' 分支处理:跳过前导空白、读取非空白字符序列、以 '\0' 结尾写入目标缓冲区;新增 baseline/scanf_string.c 回归用例;同步更新 AGENTS.md、CHANGELOG.md [Unreleased];C Shadow Verification 更新为 557/564,C++ Shadow Verification 保持 83/83;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿 维护 Agent
2026-06-25 4.21 推进任务 H:修复复合副作用数组索引触发 NULL 指针陷阱(H06)。根因是 gen_mem_inc_dec 与 gen_assign 的 Index 赋值复用 temp_slot0;修复方案为 gen_mem_inc_dec 改用 temp_slot3 保存新值;新增 baseline/side_effect_index.c 回归用例;同步更新 AGENTS.md、LEETCODE_FAILURES.md、CHANGELOG.md [Unreleased];C Shadow Verification 更新为 558/565,C++ Shadow Verification 保持 83/83;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿 维护 Agent
2026-06-25 4.22 更新维护计划:刷新 8.1 评估结论摘要中已知限制修复状态与主要短板描述;任务 H 清单更新为 P1 行为差异已清零;8.3 里程碑表格更新任务 H 状态;任务 H 新增本次推进记录小节 维护 Agent
2026-06-25 4.23 推进任务 H:修复 fclose 后 VFS FILE* 被误报为内存泄漏(H10)。根因是 host_fclose 仅关闭 VFS 文件描述符,未释放 host_fopen 在 VM Heap 中为 FILE* 结构体分配的 4 字节内存;修复方案为新增 MemoryState::free_region 并在 host_fclose 中调用;stdout/stderr 等非堆分配 stream 安全忽略;新增 baseline/fclose_leak.c 回归用例;同步更新 AGENTS.md、README.md、CHANGELOG.md [Unreleased];C Shadow Verification 更新为 559/566,C++ Shadow Verification 保持 83/83;cargo test --workspace --all-features(751 passed) / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿 维护 Agent
2026-06-25 4.24 推进任务 H:修复 VLA 数组索引缺失边界检查(H02)。vitro_codegen::expr::gen_index 对首维为变量表达式的 VLA 生成运行时边界检查;新增 TrapBoundsVla opcode(值为 129);VM 运行时将索引与运行时边界比较并触发教学诊断;新增 baseline/vla_bounds.c 回归用例;同步更新 AGENTS.md、AGENTS_EN.md、README.md、CHANGELOG.md [Unreleased];C Shadow Verification 更新为 560/567,C++ Shadow Verification 保持 83/83;cargo test --workspace --all-features(751 passed) / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿 维护 Agent
2026-06-25 4.25 推进任务 H:修复参数化宏调用后带分号无法解析(H01)。vitro_lexer 在参数化宏展开时,若宏体为大括号块且调用位置后紧跟分号,则动态将宏体包装为 do { ... } while(0),使 SWAP(int,x,y); 在 if/else 等语句中可正确解析;新增 end_to_end_extra_test::test_e2e_parametric_macro_swap_semicolon 回归测试;诚实记录此为 Vitro 教学子集扩展、Clang 标准模式仍报错的差异;同步更新 AGENTS.md、AGENTS_EN.md、CHANGELOG.md [Unreleased];C Shadow Verification 保持 560/567,C++ Shadow Verification 保持 83/83;cargo test --workspace --all-features(752 passed) / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿 维护 Agent
2026-06-25 4.26 更新维护计划:基于 scripts/engineering_health.py 刷新 8.1 评估结论摘要中工程健康度数字(生产代码 unwrap/expect 17→18、全量 45→46);确认任务 H 已处理 H01~H02、H06~H10;剩余 H03~H05 三项均为 P2/P3 不支持项,作为后续持续推进队列;文档状态与当前工作区保持一致 维护 Agent
2026-06-25 4.27 推进任务 H:修复 #include 非标准库路径不支持(H03)。vitro_lexer::Lexer 新增 base_path 字段与 with_mode_and_path 构造函数;compile_pipeline.rs 从首个编译单元文件名提取目录作为 base_path;preprocessor.rs 在 load_stub 失败后调用 load_include_file 从 base_path 读取自定义头文件;自定义头文件内容保留原始换行以支持 include guard 等预处理指令。shadow_verify.py 与 vitro_e2e.rs 改用真实源文件路径调用 vitro_compile_unit,保证 Shadow Verification 与 E2E 测试中的 include 行为与 Clang 一致。新增 baseline/include_custom_header.c / include_custom_header.h 回归用例;同步更新 AGENTS.md、CHANGELOG.md [Unreleased];C Shadow Verification 更新为 564/568(match+vitro_better+known_issue),C++ Shadow Verification 保持 83/83;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿 维护 Agent
2026-06-25 4.28 推进任务 H:修复 va_list / va_start / va_arg / va_end 自定义变参函数(H04),并将全局 VLA(H05)明确为标准限制无需修复。根因是 Parser 把所有调用解析为 Expr::CallPtr 导致变参数据未写入栈帧;修复方案为 vitro_codegen::expr::call 在 gen_call 与 gen_call_ptr 中同步生成 CallVar,按实参真实大小计算 total_arg_words,8 字节类型直接顺序压栈,__vitro_va_arg 返回地址后按目标类型解引用;vitro_typeck::decl 对变参额外实参应用默认实参提升;附带修复 long long 转换与复合赋值生成;新增 baseline/variadic.c 回归用例。H05 按 C99 标准禁止文件作用域 VLA,与 Clang 行为一致,保持不支持。同步更新 AGENTS.md、CHANGELOG.md [Unreleased] 与 工程债务维护方案.md:H04 标记为 ✅ 已修复、H05 标记为 ✅ 无需修复(标准限制),任务 H 清单全部处理完毕;C++ Shadow Verification 保持 83/83;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿 维护 Agent
2026-06-25 4.29 推进任务 C:收敛 H04 变参修复在 vitro_codegen::expr::call 中引入的 2 处生产代码 unwrap。将 gen_call 与 gen_call_ptr 中的 gen.func_table.get(name).unwrap() 重构为 if let Some(meta),避免重复查询并消除 unwrap;生产代码 unwrap/expect 从 20 降至 18,全量从 48 降至 46。同步刷新 工程债务维护方案.md 8.1 摘要与 D01 口径为 566/569,与 engineering_health.py 对外口径一致。cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check 全绿;C Shadow Verification 566/569,C++ Shadow Verification 83/83 维护 Agent
2026-06-25 4.30 继续推进任务 C:收敛 vitro_typeck::cpp_class_layout 中 1 处带 TODO(#D08) 的生产代码 unwrap。将刚 insert 后的 self.classes.get_mut(name).unwrap() 改为 match self.classes.get_mut(name),在异常路径通过 report_error 返回结构化诊断(复用 E3002_StructRedeclared)而非 panic;保留后续对 class_sym 可变引用的自然使用。生产代码 unwrap/expect 从 18 降至 17,全量从 46 降至 45;Rust TODO/FIXME/HACK 从 12 降至 11。cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check 全绿;C Shadow Verification 566/569,C++ Shadow Verification 83/83 维护 Agent
2026-06-25 4.31 继续推进任务 C:收敛 vitro_codegen::lib.rs 类大小拓扑计算中的 1 处生产代码 unwrap(class_defs.get(class_name).unwrap()),改为 if let Some(class) / continue 安全处理;收敛 vitro_codegen::expr::call.rs 与 expr::struct_.rs 中结构体/类返回值临时偏移的 4 处 unwrap,通过 if let Some(offset) 复用 Option 值,删除冗余 is_struct_ret 变量与 #[allow(clippy::unwrap_used)] 注释。确认 bTree_default 运行时缺口为模板代码访问未初始化子节点指针的已知偏差(E2E_FAILURES.md 已记录),与本次 unwrap 收敛无关。生产代码 unwrap/expect 从 17 降至 0,全量从 45 降至 28;Rust TODO/FIXME/HACK 从 11 降至 10。cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check 全绿;C Shadow Verification 566/569,C++ Shadow Verification 83/83 维护 Agent
2026-06-26 4.32 继续推进任务 G:新增 LeetCode/K&R/C++ E2E 用例 all in。LeetCode 新增 17 题(lc_7 / lc_16 / lc_17 / lc_22 / lc_24 / lc_29 / lc_38 / lc_40 / lc_50 / lc_54 / lc_168 / lc_242 / lc_344 / lc_412 / lc_509 / lc_704 / lc_746 / lc_977),扩展至 109 题;K&R 新增 5 个变体(kr_1_hello / kr_2_celsius / kr_4_atoi / kr_5_itoa / kr_6_getword),扩展至 81 个用例;C++ E2E 新增 10 题(cpp_pair_template / cpp_template_func_multi / cpp_reference_member / cpp_template_array / cpp_template_stack / cpp_unique_ptr_reset / cpp_class_array / cpp_ctor_init_list / cpp_reference_param_chain / cpp_function_overload_template),扩展至 71 题;探索用例 cpp_move_semantics 因触发内存泄漏报告未纳入。诚实记录 Vitro C++ 子集不支持类类型模板实参、非类型模板参数、嵌套类实例化、const 引用参数、默认参数、自定义拷贝构造等特性。同步刷新 engineering_health.md 与 8.1/8.3 评估摘要;C Shadow Verification 606/610,C++ Shadow Verification 93/93;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿 维护 Agent
2026-06-26 4.33 继续推进任务 G:第二批 all in 新增 20 道 LeetCode 简单/中等题(lc_7 / lc_67 / lc_83 / lc_190 / lc_191 / lc_202 / lc_205 / lc_219 / lc_231 / lc_263 / lc_292 / lc_345 / lc_349 / lc_367 / lc_383 / lc_389 / lc_392 / lc_401 / lc_409 / lc_415),LeetCode 防线扩展至 128 题;逐题生成 Clang golden 并验证 Vitro Shadow Verification 无回归;修复 lc_219 实现兼容问题与 lc_349 输出格式问题;lc_367 golden 生成时 Clang 链接报 permission denied,定位后重新生成成功。同步刷新 engineering_health.md 与 8.1/8.3 评估摘要;C Shadow Verification 606/610,C++ Shadow Verification 93/93;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿 维护 Agent
2026-06-26 4.34 继续推进任务 G:第三批 all in 新增 10 道 LeetCode 简单/中等题(lc_257 / lc_290 / lc_326 / lc_404 / lc_448 / lc_496 / lc_617 / lc_36 / lc_150 / lc_199),LeetCode 防线扩展至 138 题;逐题生成 Clang golden 并验证 Vitro Shadow Verification 无回归。诚实记录并绕过 3 处 Vitro 与 Clang 行为差异/已知限制:① (*int_ptr)++ 在 Vitro 中实际按指针步长(+4)递增而非值 +1,需改用 *p = *p + 1;② sprintf(fmt, ..., struct_ptr->member) 变参传递时 Vitro 会错误传递结构体指针地址而非成员值,需先提取到局部 int 再传入;③ 多维数组作为函数参数时 Vitro 的行偏移计算错误,需改用一维数组手动索引。lc_617 中 NULL 作为三目运算符分支需显式转换为对应指针类型 (struct TreeNode*)0 以避免 Vitro 报类型不匹配。同步刷新 engineering_health.md 与 8.1/8.3 评估摘要;C Shadow Verification 616/620,C++ Shadow Verification 93/93;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / C++ Shadow Verification 全绿 维护 Agent
2026-06-26 4.35 继续推进任务 B:拆分 crates/vitro_lexer/src/lib.rs(1022 → 403 行),新增 lexer/macros.rs(内置预定义宏)与 lexer/expand.rs(对象式/参数化宏展开),解决 H01 参数化宏 do { ... } while(0) 包装逻辑与内置宏表膨胀导致的入口文件 oversized 问题;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / C Shadow Verification 616/620 / C++ Shadow Verification 93/93 全绿 维护 Agent
2026-06-26 4.36 推进 Phase 42:vitro_vec<T> 类类型模板实参支持。vitro_typeck::cpp_monomorph.rs 新增 try_synthesize_builtin_container_class / synthesize_vec_class,对类类型实参合成走普通类模板路径的 vitro_vec<T> 实例化(含默认构造、析构、size / get / push_back);vitro_codegen::expr::new_delete.rs 修复 delete[] 无论元素是否有显式析构函数都必须释放 base 地址的问题;vitro_parser/src/cpp.rs 透传类类型模板实参;新增 C++ E2E 用例 cpp_vitro_vec_class(// category: gap,Clang++ 无法直接编译 Vitro 内置容器)及其 golden;scripts/shadow_verify_cpp.py 支持首行 // category: 标记;native/tests/CPP_FAILURES.md 更新为 72 个 E2E 用例;vitro_list<T> 类类型实参仍标记 TODO 待后续迭代。C Shadow Verification 616/620,C++ Shadow Verification 93/94;cargo test --workspace --all-features(752 passed) / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿 维护 Agent
2026-06-26 4.37 推进 Phase 42:vitro_list<T> 类类型模板实参支持。vitro_typeck::cpp_monomorph.rs 新增 synthesize_list_class,合成辅助节点类 vitro_list_node<T> 与主类 vitro_list<T> 的默认构造、析构、size / get / push_back / clear;将 vitro_list_node<T> 推入 pending_class_instantiations 使其进入 program.classes;vitro_codegen::lib.rs 修复类大小拓扑计算,字段类型为类时必须等依赖类大小计算完成;新增 C++ E2E 用例 cpp_vitro_list_class(// category: gap)及其 golden;native/tests/CPP_FAILURES.md 更新为 73 个 E2E 用例;去掉 1 处 TODO。C Shadow Verification 616/620,C++ Shadow Verification 93/95;cargo test --workspace --all-features(752 passed) / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿 维护 Agent
2026-06-26 4.38 推进任务 B:拆分 crates/vitro_typeck/src/cpp_monomorph.rs(1443 → 18 行入口),新增 cpp_monomorph/func.rs(函数模板单态化)、cpp_monomorph/class.rs(类模板单态化)、cpp_monomorph/replace.rs(类型替换:replace_template_type / replace_template_types_in_stmt / replace_template_types_in_expr / resolve_template_id)、cpp_monomorph/synth.rs(合成 AST 小工具)、cpp_monomorph/builtin.rs(内置容器分发入口)、cpp_monomorph/builtin_vec.rs(vitro_vec<T> 类类型实参合成)、cpp_monomorph/builtin_list.rs(vitro_list<T> 类类型实参合成);pub(crate) 可见性调整保证跨子模块 impl 调用;所有子文件 <800 行;C Shadow Verification 616/620、C++ Shadow Verification 93/95 无新增失败;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check 全绿 维护 Agent
2026-06-26 4.39 推进任务 B:拆分 native/src/unified/trace_analyzer.rs(838 → 55 行入口),新增 trace_analyzer/bounds.rs(数组越界分析与 BoundsCategory 推断)、trace_analyzer/use_after_free.rs、trace_analyzer/double_free.rs、trace_analyzer/div_zero.rs、trace_analyzer/null_deref.rs、trace_analyzer/utils.rs(共享工具与 LoopInfo)、trace_analyzer/tests.rs(单元测试);按运行时陷阱类型分模块,保持 TraceAnalyzer::analyze_trap 公共入口不变;所有子文件 <800 行;C Shadow Verification 616/620、C++ Shadow Verification 93/95 无新增失败;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check 全绿 维护 Agent
2026-06-26 4.40 拓展 C++ 缺失特性:支持 const T& 函数/方法参数绑定到右值。TypeChecker 统一函数调用、方法调用、函数指针调用的参数检查路径,允许 const T& 形参接受字面量 / 表达式右值;非 const 引用形参绑定右值时给出明确错误。CodeGen 在 UnaryOp::Addr 中对右值表达式自动物化临时局部变量并返回地址。新增 native/tests/cases/cpp/cpp_const_reference_param.cpp 回归用例;同步更新 AGENTS.md、CHANGELOG.md [Unreleased]、CPP_FAILURES.md;C Shadow Verification 620/620、C++ Shadow Verification 94/96(+1 新增用例,2 个已记录 clang_compile_fail 不变);cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿 维护 Agent
2026-09-11 4.41 修复代码审查 E-P1-5:程序 stdout 与引擎附注混装。根因是 RuntimeState::output_lines(单条字节流)同时承担"程序 stdout / 程序 stderr / 引擎附注"三种语义,且附注可在流中间插入(堆耗尽提示);消费方只能靠文本正则清洗,规则散落十余处且语义互不一致(全局替换 vs 行内截断、>=30 vs ==30 等号、丢空行 vs 仅 strip),教学程序自己打印 程序运行完成,返回值:7 时会被整段删除(假阳性 output_gap)。修复:vitro_runtime 新增 OutputKind{Stdout,Stderr,Note} + OutputChunk,RuntimeState::output_chunks 成为唯一真相并暴露 stdout()/stderr()/notes()/display() 投影;约 20 处 push 点分类迁移(fprintf(stderr)/perror 首次与 stdout 分流);快照携带分段;capi 新增 vitro_get_program_output* / vitro_get_engine_notes* / vitro_get_program_output_delta(ABI 1.0.0 → 1.1.0,加函数=minor;vitro_get_output* 保持展示视图语义不变,避免破坏前端集成测试);vitro_cli serve 的 output.delta 新增 stream 参数;十余处清洗规则全部删除,两条 Shadow 驱动共用 vitro_output.py 并在 DLL 缺符号时 fail fast;新增回归用例 baseline/engine_note_lookalike.c(+Clang golden)与 end_to_end_extra_test::test_e2e_engine_note_does_not_pollute_stdout。顺带修复 scripts/shadow_verify_cpp.py 的 tempfile 沙箱崩溃(改用自管 .shadow_cpp_tmp/,已 gitignore);诚实记录 fprintf 到自定义 FILE* 不落盘的既有偏差。实测:cargo test(全部套件 0 failed)/ cargo clippy --workspace --all-targets --all-features -- -D warnings / C Shadow Verification 633 用例(match 614 + vitro_better 16 + known_issue 3,0 非预期差异) / C++ Shadow Verification 98/100(2 个已记录 clang_compile_fail)全绿;cargo fmt --check 仅余工作区既有未提交代码的差异(本轮改动文件已逐文件校验干净) 维护 Agent
2026-09-11 4.42 复核外部 PR 清单(12 项)并启动分批修复:新增 ARCHIVE_代码审查复核20260911.md 记录独立复现结论(12 项全部成立,其中 3 处表述修正:P0-2 的 24 次越界描述落在"交换"而非"比较"模板、P1-6 实为 W3053 警告而 CLI 误标 (E3053)、P2-7c 字段名为 ty_name;另发现清单未提的 2 项同源问题:code_line 是跨文件全局偏移行号、同名变量会连带污染 semantic_label)。批次 A 完成:① P0-1 冒泡趟数文案 n - i → i + 1(vitro_algorithm_steps/src/sorting.rs,实测 desc 由"第 1 趟:第 5 大"变为"第 1 趟:第 1 大");② P1-5 vitro_cli compile 编译失败改为 exit(1)(实测坏文件 0 → 1,正常文件仍 0);③ 引擎附注粘连:RuntimeState::push_note 统一补尾随 \n(仅 note 通道,stdout/stderr 逐字节保真),泄漏报告恢复逐行输出。回归:cargo test(end_to_end_extra / fuzz / host_contract / capi_first_batch / step_payload_schema / crash_regression)366 passed / 0 failed;cargo build --release 通过。批次 B~E(P2-7、P0-2/P0-3、P0-4、P1-6)待续 维护 Agent
2026-09-11 4.43 复核清单批次 B 完成(P2-7 三项 + 一项同源缺陷):① P2-7a 同名变量:Symbol 新增 decl_line 字段(codegen 参数/局部/静态/全局四处构造点 + compile_pipeline 两处转换 + 2 个测试构造点同步),VitroVM::get_variable_snapshot 改为按(函数归属、声明行)过滤并同名去重,code_line == 0 时不输出局部变量;② 顺带修复清单未提的同源缺陷——函数内符号此前不过滤函数归属,helper 的局部变量会以 main 的 locals_base 读出(地址错位 + 污染 semantic_label);③ P2-7b 数组 local_vars 的 value 改为元素摘要(>16 元素截断),addr 保留;④ P2-7c 新增 vitro_runtime::type_display_name(C 风格可读类型名,单一来源,同时接管 array_snapshots[].element_ty)。新增回归 native/tests/step_payload_vars_test.rs(3 用例,验证同名按声明行切换 / 跨函数隔离 / 数组摘要与可读类型名);STEP_PAYLOAD_SCHEMA_V0_1.md §2.1 与 §8 同步(#7 标记已修、新增 #8)。实测:cargo test 全量 0 failed(含新 3 用例);cargo check --all-targets 通过 维护 Agent
2026-09-11 4.44 复核清单批次 C 完成(P0-2 / P0-3):① P0-2 vitro_algorithm_steps::sorting::infer_bubble_sort 新增内层下标有效性判据(内层条件 j < n-1-i ⇒ 合法上界 n-2-i),j 停在退出值时不再产出"比较/交换 arr[j] 与 arr[j+1]"(实测含 arr[5] 的描述 24 → 0 步);② P0-3 native/src/unified/collector.rs 交换标签不再取 loop_vars.first()(白名单首位常是规模量 n ⇒ 交换 arr[5]↔arr[6]),改为从源码行解析 arr[<ident>] 后查循环变量值(回退 j → i → k),同一步两套标注现已一致。回归:step_payload_vars_test.rs 扩至 6 用例;clippy 全绿 维护 Agent
2026-09-11 4.45 复核清单批次 D + E 完成:批次 D(P0-4 多文件行号)——新增 Session::source_line_at(global_line),按多文件合并产出的 file_ranges 把全局行号换回(文件, 文件内行号);unified/collector.rs、AlgorithmContext::source_line、unified/engine.rs、trace_analyzer/utils.rs 四处各自为政的 compile_units.first() 实现全部收敛到它;顺带修掉"函数定义行被标成递归调用"(int helper(int x) { 含 helper()。批次 E(P1-6 向上转型)——新增专用错误码 W3067_PointerTypeMismatch(含错误目录与建议文案)+ TypeChecker::is_upcast 单继承链可达性判定,Base* b = new Derived(); 不再报"不兼容/数据截断"(与 clang++ -Wall -Wextra 零警告一致);向下转型与无关类型仍报 W3067 但文案改为指针语义;补录 C++子集规范.md §4.5(此前该差异未记录,违反诚实记录纪律),并如实记录剩余差异(Clang 对向下转型是 error 拒绝编译、Vitro 仅警告)与显示瑕疵(警告 code 被加 E 前缀)。回归:新增 native/tests/pointer_upcast_test.rs(3 用例)、step_payload_vars_test.rs 扩至 8 用例;cargo test 全量 0 failed、clippy 全绿、C/C++ shadow 防线与 serve 冒烟复测通过(见 ARCHIVE_代码审查复核20260911.md §5 状态汇总) 维护 Agent
2026-09-11 4.46 复核清单批次 F 完成(条目 5 + 3 项关联缺陷):为决议 §6 最后一项"第三道墙"补用例时,发现第二道墙本身是坏的 —— compile_pipeline::setup_vm 硬编码 vm.set_max_steps(10_000_000),每次 run 抹掉会话配置,步数保险丝对全速运行的程序从未生效(实测设 2000 步的程序跑到 305216 步、撞 1MB 堆墙才停;旧用例只断言"消息含步数超限",1000 万步同样满足故长期掩盖)。同批修复:① 删除该硬编码行(默认值由 VitroVM::default() 提供、reset() 保留配置);② capi vitro_set_max_steps / vitro_set_call_depth_limit 与 serve config.set 的"无 VM 时静默丢弃却返回成功"下沉为 Session::set_max_steps / set_call_depth_limit;③ session_api::config() 补 max_steps / call_depth_limit 回显 + VitroVM::max_steps() getter;④ 新增 test_third_wall_region_table_bounded_when_step_fuse_trips_first(region 条数 ≤ 步数上限)。回归:新增 native/tests/session_config_test.rs(4 用例)、强化 test_second_wall_max_steps_fuse 断言;决议文档 §6 更新为三道墙全部完成 维护 Agent
2026-09-11 4.47 复核清单批次 G 完成(条目 3 / 条目 4 + 输入口径统一 + 防线扩容):① 条目 3 —— scanf 返回值按 C11 7.21.6.2 返回"成功匹配并赋值的项数"(typeck 由 void 改 int、host_scanf_n 统计并压栈,与早已正确的 sscanf 对齐),int r = scanf(...) 与 while (scanf(...) != EOF) 类写法恢复可用;② 条目 4 —— 新增 ScanfItem::Literal(u8),格式串普通字符指令与输入流精确比较、不匹配即停止解析,%% 亦参与匹配,sscanf 同族同修;③ 标准输入换行口径统一(防线扩容后暴露)—— capi vitro_set_input / FRB set_input / serve run.input / CLI -i 原先各自 str::lines() 丢掉行尾 \n,而 E2E 用 split_inclusive('\n'),导致 getchar() 永远读不到换行;现统一到 RuntimeState::split_stdin / set_stdin;④ Shadow 防线支持用例自带 .in 注入 —— K&R 目录 29 个 .in 从未被使用("两侧都无输入"的虚假 match),现 Clang 与 Vitro 喂同一份字节、缓存 key 纳入真实 stdin;首次启用即暴露 19 例 output_gap(kr_1_8 换行计数恒 0 等),修复换行口径后全部转绿。新增 3 个 Shadow/E2E 用例(scanf 返回值 / 字面匹配 / 字面不匹配-负向)。实测:C Shadow 636 用例(match 617 + vitro_better 16 + known_issue 3,0 非预期差异)、C++ Shadow 0 非预期差异、cargo test 全量 0 failed、clippy 全绿、serve 冒烟通过 维护 Agent
2026-09-11 4.48 复核清单批次 H 完成(条目 1 / 条目 2)—— 12 项清单全部处理完毕:① 条目 1(lambda 返回类型硬编码 int)—— 新增 TypeChecker::infer_lambda_return_type(取 body 首个 return 的轻量推断:字面量/形参/捕获变量/二元取较宽者/显式转型),存入 LambdaInfo::return_type,resolve_lambda 注册的 __call 签名与 Pass 4 生成的 FuncDecl 共用同一来源(实测 [](double x){return x*2.0;} → d=3.00,与 Clang++ 一致;此前触发 E3062);② 条目 2(文件作用域 lambda 变量)—— Pass 2.5 改为先定型再登记(全局 auto/typeof 先由初始化器解析出类型并替换 g.ty 再 declare_var,解析结果缓存复用避免 pending_lambdas 二次登记),实测 auto gf = [](int x){return x+7;}; → gg=8 6 与 Clang++ 一致(此前 E3066);③ 4 个类型工具函数提升为 pub(crate)。回归:新增 native/tests/cpp_lambda_test.rs(3 用例),CPP_FAILURES.md 两项标记已修复并如实记录剩余限制(多 return 合并与尾置返回类型 -> T 仍按 int)。最终实测:cargo test 全量 0 failed、clippy 全绿、C Shadow 636 用例(617 match + 16 vitro_better + 3 known_issue,0 非预期差异)、C++ Shadow 0 非预期差异、serve 冒烟通过 维护 Agent

八、后续计划(2026-06-17 全面评估后)

本章节基于 2026-06-17 最新全面评估结果制定,承接 工程债务维护方案 前五阶段已完成工作,聚焦长期可维护性与产品质量收尾。

8.1 评估结论摘要

当前项目处于 MoonBit 迁移期(2026-09-18 起,总计划——Rust 区冻结为差分 oracle,Phase 42 随砍 C++ 裁定冻结于 oracle〔2026-09-20〕),并已于 2026-09-11 完成前端切割、转入纯后端「三出口一核心」阶段。下表口径 as-of 2026-09-11,已剔除前端项(数据来源:reports/engineering_health.md、native/tests/shadow_verification/reports/shadow_report_latest.md、CPP_FAILURES.md;未能核实者明确标注「待核实」):

维度 当前状态
C Shadow Verification 636/636(完全匹配 617 = 97%,另 vitro_better 16 + known_issue 3;0 编译缺口 / 0 运行时缺口 / 0 输出差异;2026-09-11 20:00 实测,jobs=8)
C++ Shadow Verification 98/100(2 个已记录的 clang_compile_fail:cpp_vitro_vec_class / cpp_vitro_list_class 因使用 Vitro 内置容器无法被 Clang++ 直接编译;2026-09-11 复测一致)
E2E 回归 Baseline 321 / K&R 81 / LeetCode 138 / gap 14 全绿;Template 82 例(4 个已知偏差,见 E2E_FAILURES.md);C++ E2E 为 native/tests/cases/cpp/ 下 78 个 .cpp 用例文件(2026-09-11 实测),CPP_FAILURES.md 正文仍记为 74 个 —— 口径待核实/同步
三层契约 Host/Bytecode/Differential 全绿
Fuzz 5/5 通过
Clippy 0 warning
生产代码 unwrap/expect 3 处(全量 27 处;reports/engineering_health.md 2026-09-11 口径)—— ⚠️ 相对任务 C 的「0 处」验收标准已回升,全部位于 native/crates/vitro_typeck/src/decl.rs,新记为 D14
TODO/FIXME Rust 10 处(2026-09-11 实测);Dart 6 处 → 随前端切割归零(仓库内 .dart 文件数为 0)
活跃失败记录 12 条(reports/engineering_health.md 2026-09-11 口径,口径已统一)
任务 B 超大文件拆分 ✅ 已完成(前端项已消解,新增 1 处超标):native/crates/vitro_typeck/src/builtin.rs、native/crates/vitro_typeck/src/cpp_monomorph/(1443 → 18 行入口 + 7 个子模块)、native/src/unified/trace_analyzer/(838 → 55 行入口 + 7 个子模块);CideFlutter/lib/widgets/custom_keyboard.dart(991 → 12 行 + 5 个 keyboard/ 子文件)为前端资产,已迁出,该子项关闭;⚠️ 2026-09-11 复核:199 个 .rs 文件中 native/crates/vitro_typeck/src/decl.rs 871 非空行超出 800 行阈值(新记为 D16),其余文件均达标
已知限制修复 H01 参数化宏调用后带分号 ✅ 已修复(扩展支持,与 Clang 存在差异);H02 VLA 边界检查缺失 ✅ 已修复;H03 #include 非标准库路径 ✅ 已修复(支持 #include "header.h" 基于源文件目录加载);H04 va_list / va_start / va_arg / va_end 自定义变参函数 ✅ 已修复;H05 全局 VLA ✅ 明确为标准限制(C99 禁止文件作用域 VLA,Clang 同样报错)无需修复;H06 复合副作用数组索引 ✅ 已修复;H07 函数返回 double 异常 ✅ 已修复;H08 scanf %s 不支持 ✅ 已修复;H09 fputs(str, stdout) 无输出 ✅ 已修复;H10 fclose 后 VFS FILE* 泄漏误报 ✅ 已修复;AGENTS.md 已知限制清单全部处理完毕
任务 G 推进发现 JIT 统计信息污染 stdout 已修复,新增 vitro_get_jit_stats C API

主要短板:Workspace 拆分已进入平台期(vitro_shared/vitro_ast/vitro_runtime/vitro_vm/vitro_lexer/vitro_parser/vitro_cpp_frontend/vitro_typeck/vitro_codegen/vitro_algorithm_steps 已独立;unified/checkpoint.rs 的 CheckpointManager 已下沉到 vitro_vm::snapshot;剩余 unified/types.rs/stream.rs/root_cause.rs、engine/、diagnostics 仍保留在 vitro_native 内部,native/src/api/ 已随前端切割删除)。FRB 已移除,原有孤儿规则阻碍消失,unified/diagnostics/engine 的拆分可重新评估(尚未执行;Rust 区冻结后不再执行,等价结构已由 MoonBit 侧 L0–L9 包切分重建);vitro_api 一项需按「C API / CLI 入口」重新界定(native/src/capi/、native/src/bin/、native/src/flutter_bridge.rs)。其余短板:编译管线三阶段镜像耦合、多入口 API 重复包装、生产代码 unwrap/expect 回升至 3 处(D14)、工程健康度脚本仍带前端时代口径且未门禁化(D15)、native/crates/vitro_typeck/src/decl.rs 871 行超出任务 B 的 800 行阈值(D16);AGENTS.md 已知限制清单(H01~H10)已全部处理或明确记录原因;H01 参数化宏分号已作为教学子集扩展支持但与 Clang 存在差异,H03 自定义头文件 include 已支持,均已诚实记录;Phase 42(随砍 C++ 冻结于 oracle,2026-09-20):vitro_vec<T> / vitro_list<T> 类类型模板实参均已支持,const T& 参数已支持绑定右值,cpp_monomorph.rs 已拆分为 18 行入口 + 7 个子模块,所有子文件 <800 行。

8.2 下阶段重点任务

任务 A:Rust 后端 Workspace 拆分(P1,预计 3~4 周)

目标:将 native 单 crate 拆分为多个逻辑 crate,降低编译缓存粒度与模块耦合。

建议 crate 划分:

crate 职责 当前对应目录 状态
vitro_ast AST 定义与基础类型 crates/vitro_ast/ ✅ 已拆分
vitro_lexer 词法分析 crates/vitro_lexer/ ✅ 已拆分
vitro_parser 语法分析 crates/vitro_parser/ ✅ 已拆分
vitro_typeck 类型检查 crates/vitro_typeck/ ✅ 已拆分
vitro_codegen 字节码生成 crates/vitro_codegen/ ✅ 已拆分
vitro_vm 虚拟机与 host 函数 crates/vitro_vm/ ✅ 已拆分
vitro_algorithm_steps 算法步骤语义标注 crates/vitro_algorithm_steps/ ✅ 已拆分
vitro_unified 统一模式 / 时间旅行 native/src/unified/ ⚠️ 部分下沉(algorithm_steps 已独立,CheckpointManager 已下沉到 vitro_vm::snapshot;trace_analyzer.rs 已拆分为 trace_analyzer/ 子模块;types.rs/stream.rs/root_cause.rs/engine.rs/collector.rs 仍保留在 vitro_native 内部 —— FRB 已移除,原孤儿规则阻碍消失,可重新评估(尚未执行;Rust 区冻结后不再执行,等价结构已由 MoonBit 侧 L0–L9 包切分重建),剩余阻力是与 Session 的耦合)
vitro_diagnostics 诊断、知识图谱、自动修复 native/src/diagnostics/ ⚠️ 暂保留在 vitro_native 内部;FRB 已移除,原有孤儿规则阻碍消失,可重新评估(尚未执行;Rust 区冻结后不再执行,等价结构已由 MoonBit 侧 L0–L9 包切分重建)
vitro_engine 编译管线编排 native/src/engine/ ⏳ 待拆分(阻力为 Session 耦合,非 FRB)
vitro_api C API / CLI 入口(原含 FRB 出口) native/src/capi/、native/src/bin/、native/src/flutter_bridge.rs(历史会话包装层,vitro_cli 消费,名称待收敛);native/src/api/ 已随前端切割删除 ⏳ 待拆分(FRB 阻碍已消失,边界需重新界定)

执行步骤:

  1. ✅ 在 native/Cargo.toml 中建立 workspace,已迁移 vitro_shared(SourceLoc)与 vitro_ast(AST/类型系统)。
  2. ✅ 拆分 vitro_runtime:下沉 func_meta/symbol/type_utils、RuntimeState/MemoryState 及依赖类型、内存布局常量、unified_types 基础数据;session.rs 改为带 #[frb] 类型的薄包装层 + re-export(#[frb] 标记已于 2026-09-11 前端切割时清除,native/src/session.rs 仍为本仓语言中立会话状态)。
  3. ✅ 拆分 vitro_vm:将 native/src/vm/ 完整迁移到 crates/vitro_vm;引入 VmContext 替代 Session 上帝对象,打破 vm 与 session 的循环依赖;vitro_native 通过 pub use vitro_vm as vm; 保持路径兼容。
  4. ✅ 拆分 vitro_lexer:将 ErrorCode 下沉到 crates/vitro_shared;将 native/src/compiler/lexer.rs 与 native/src/compiler/lexer/ 子模块完整迁移到 crates/vitro_lexer;vitro_native 通过 pub use vitro_lexer as lexer; 保持路径兼容。
  5. ✅ 拆分 vitro_parser:将 native/src/compiler/parser/ 全部 10 个文件完整迁移到 crates/vitro_parser;vitro_shared 新增 SourceLoc re-export;vitro_native 通过 pub use vitro_parser as parser; 保持路径兼容。
  6. ✅ 拆分 vitro_cpp_frontend:将 native/src/compiler/cpp_frontend/ 完整迁移到 crates/vitro_cpp_frontend;vitro_native 通过 pub use vitro_cpp_frontend as cpp_frontend; 保持路径兼容。
  7. ✅ 拆分 vitro_typeck:将 vm::host_func_id/vm::bytecode_libc_index/vm::bytecode_libc_sig 下沉到 vitro_runtime;将 native/src/compiler/typeck/ 全部 22 个文件完整迁移到 crates/vitro_typeck;vitro_native 通过 pub use vitro_typeck as typeck; 保持路径兼容。
  8. ✅ 拆分 vitro_codegen:将 native/src/compiler/codegen/ 全部 26 个文件完整迁移到 crates/vitro_codegen;下沉 vitro_vm::opcode/vitro_vm::instruction 与内存布局常量到 vitro_runtime,切断 codegen 对 vitro_vm 的直接依赖。
  9. ✅ 拆分 vitro_algorithm_steps:将 native/src/unified/algorithm_steps/ 完整迁移为独立 crate;通过 AlgorithmContext trait 解耦对 Session 的依赖;vitro_native 通过 pub use vitro_algorithm_steps as algorithm_steps; 保持 crate::unified::algorithm_steps 路径兼容。
  10. ✅ 迁移 CheckpointManager:将 native/src/unified/checkpoint.rs 的 CheckpointManager 下沉到 vitro_vm::snapshot;重构 should_checkpoint 接收 semantic_label: &str,save 接收 &mut VmContext,彻底去除对 Session/StepMeta 的依赖;更新 unified/engine.rs、flutter_bridge.rs、bin/vitro_cli.rs、tests/test_snapshot.rs 调用点。
  11. ⚠️ unified/engine/api 拆分受阻的原因已于 2026-09-11 部分失效,如实更新:
  • FRB 已移除,原有孤儿规则阻碍消失:unified/types.rs 的 StepPayload/AlgorithmStepSnapshot/PointerSnapshot 等类型已不再带 #[frb] 属性,vitro_native 也不再为其生成 IntoIntoDart 实现;api 模块(native/src/api/,原 FRB 出口)已整体删除。原「必须等 FRB 跨 crate 绑定策略明确」的前提不再成立。
  • 剩余阻力只有 Session 耦合:engine(compile_pipeline.rs/session_ops.rs)与 unified 仍依赖 crate::session::Session,直接拆分仍会形成 vitro_engine → vitro_native → vitro_engine 的循环依赖,需先建立独立的 vitro_session(语言中立核心状态)crate。
  • 结论:unified/diagnostics/engine 的拆分可重新评估(尚未执行;Rust 区冻结后不再执行,等价结构已由 MoonBit 侧 L0–L9 包切分重建) —— 2026-09-11 复核时三者仍位于 vitro_native 内部;后续按「先 vitro_session、再 unified/engine/diagnostics」的顺序推进,工程量大,不在文档翻新范围内强制启动。
  1. ⚠️ vitro_diagnostics 暂保留在 vitro_native 内部:FRB 已移除,原有孤儿规则阻碍已消失,可重新评估(尚未执行;Rust 区冻结后不再执行,等价结构已由 MoonBit 侧 L0–L9 包切分重建);当前主要阻力是其与 Session/诊断上下文的耦合。
  2. 每迁移一个 crate,执行 cargo test --workspace --all-features 与 Shadow Verification 验证无回归。
  3. 评估 vitro_engine / vitro_api 独立 crate(P6):FRB 已移除,原「含 #[frb] 类型 + 孤儿规则」的阻碍消失;当前唯一实质阻力是二者仍深度依赖 crate::session::Session/CompileState(语言中立但耦合度高)。结论:拆分可重新评估(尚未执行;Rust 区冻结后不再执行,等价结构已由 MoonBit 侧 L0–L9 包切分重建),建议路径为先建立 vitro_session 语言中立核心状态 crate,再依次迁移 unified → engine → diagnostics。vitro_api 边界需按纯后端出口(capi / CLI / flutter_bridge.rs)重新界定。

验收标准:

  • cargo test --workspace --all-features 全绿。
  • C/C++ Shadow Verification 无新增失败。
  • 单 crate 行数不超过 1.5 万行。
  • cargo check 增量编译时间下降 ≥20%。

风险:

  • Workspace 拆分会改变模块间可见性,需大量调整 pub 与 use;建议小步迁移,一次一个 crate。
  • 含 #[frb] 导出类型的模块(如 diagnostics)拆分为独立 crate 会触发 FRB 孤儿规则 —— 该风险已随 2026-09-11 FRB 移除而消失。当前拆分风险转为:Session 上帝对象耦合(需先抽 vitro_session)、跨 crate 可见性调整(大量 pub/use 变更),仍建议小步迁移,一次一个 crate。

任务 B:超大单体文件继续拆分(P1,预计 2~3 周)✅ 已完成

目标:将剩余超过 1000 行的核心文件拆分为职责清晰的子模块。

路径说明(2026-09-11):下表部分路径为 crate 迁移前的历史路径,现已沉降为 —— native/src/vm/ → native/crates/vitro_vm/src/;native/src/compiler/ast.rs → crates/vitro_ast/src/;native/src/unified/algorithm_steps.rs → native/crates/vitro_algorithm_steps/src/;native/src/compiler/algorithm_detector.rs 的目录仍位于 native/src/compiler/algorithm_detector/。前端资产 CideFlutter/lib/widgets/custom_keyboard.dart 已随切割迁出,该子项关闭。

已完成拆分:

文件 原行数 拆分后入口行数 拆分方向
crates/vitro_lexer/src/lib.rs 1538 655 按 token 类别拆分为 token.rs、number.rs、string.rs、comment.rs、keyword.rs、preprocessor.rs
native/src/compiler/ast.rs 1253 76 按 AST 节点大类拆分:ast/expr.rs、ast/stmt.rs、ast/decl.rs、ast/types.rs
crates/vitro_typeck/src/lib.rs 1326 485 提取 context.rs、convert.rs、init.rs、symbols.rs
crates/vitro_typeck/src/expr/mod.rs 1162 183 按表达式类型拆分:expr/ops.rs、expr/literal.rs、expr/var.rs、expr/call.rs、expr/cast.rs、expr/cpp.rs
crates/vitro_parser/src/expr/mod.rs 1170 50 按表达式优先级拆分:expr/ops.rs、expr/unary.rs、expr/postfix.rs、expr/primary.rs
native/src/unified/algorithm_steps.rs 1439 170 按算法类别拆分:algorithm_steps/sorting.rs、algorithm_steps/graph.rs、algorithm_steps/tree.rs、algorithm_steps/structures.rs、algorithm_steps/search.rs、algorithm_steps/math.rs、algorithm_steps/dp.rs
native/src/vm/core/executor.rs 1601 451 按指令大类拆分:executor/arithmetic.rs、executor/memory.rs、executor/control.rs、executor/float.rs、executor/stack.rs、executor/debug.rs
native/src/compiler/algorithm_detector.rs 1145 44 按算法类别拆分:algorithm_detector/features.rs、sorting.rs、graph.rs、tree.rs、search.rs、math.rs、string.rs、structures.rs(仍位于 native/src/compiler/algorithm_detector/)
crates/vitro_vm/src/core/mod.rs 1221 30 提取 core/state.rs(667 行)、core/memory.rs(387 行)、core/snapshot.rs(169 行)
crates/vitro_codegen/src/lib.rs 1148 761 提取 func.rs(进入/退出函数)、init.rs(全局初始化扁平化、stride 计算)、tests.rs(单元测试);后续随 crate 迁移路径改为 crates/vitro_codegen/src/lib.rs
crates/vitro_codegen/src/stmt/mod.rs 884 85 按语句类型拆分为 stmt/control.rs(if/while/for/return 等)、stmt/var_decl.rs(变量声明与初始化)、stmt/switch.rs、stmt/block.rs、stmt/expr_stmt.rs、stmt/cpp.rs

剩余待拆分队列(本次更新后):

无。

本次新增拆分:

文件 原行数 拆分后入口行数 拆分方向
native/src/diagnostics/error_catalog.rs 968 455 按错误码范围拆分为 error_catalog/lexer.rs(1000~1999)、parser.rs(2000~2999)、semantic.rs(3000~3999)、cpp.rs(4000~4999);generate_fix 保留在入口文件
native/crates/vitro_typeck/src/builtin.rs 1034 336 按函数类别拆分为 builtin/memory.rs、builtin/string.rs、builtin/io.rs、builtin/file.rs、builtin/math.rs;visit_call 分派与格式字符串工具保留在入口文件
CideFlutter/lib/widgets/custom_keyboard.dart(前端资产,已迁出) 991 12 ✅ 已随前端切割消解(2026-09-11):使用 Dart part 机制拆分为 keyboard/layout.dart(核心状态与 build)、keyboard/letters.dart(字母模式 extension)、keyboard/numbers.dart(数字模式 extension)、keyboard/symbols.dart(符号模式 extension)、keyboard/gestures.dart(_KeyButton/_LetterKey);成果随 CideFlutter/ 迁出,本仓已无 .dart 文件
native/crates/vitro_typeck/src/cpp_monomorph/(入口 mod.rs,2026-09-11 起为目录 + 子模块) 1443 18 按职责拆分为 cpp_monomorph/func.rs(函数模板单态化)、cpp_monomorph/class.rs(类模板单态化)、cpp_monomorph/replace.rs(类型 / 语句 / 表达式模板参数替换)、cpp_monomorph/synth.rs(合成 AST 小工具)、cpp_monomorph/builtin.rs(内置容器分发入口)、cpp_monomorph/builtin_vec.rs(vitro_vec<T> 类类型实参合成)、cpp_monomorph/builtin_list.rs(vitro_list<T> 类类型实参合成)
native/src/unified/trace_analyzer.rs 838 55 按运行时陷阱类型拆分为 trace_analyzer/bounds.rs(数组越界 / BoundsCategory 推断)、trace_analyzer/use_after_free.rs、trace_analyzer/double_free.rs、trace_analyzer/div_zero.rs、trace_analyzer/null_deref.rs、trace_analyzer/utils.rs(共享工具 / LoopInfo)、trace_analyzer/tests.rs(单元测试)

验收标准:

  • ⚠️ 每个源文件行数降至 800 行以内 —— 2026-09-11 复核已不满足:199 个 .rs 文件中 native/crates/vitro_typeck/src/decl.rs 为 871 非空行(新记 D16),其余全部达标。
  • 所有 Rust 测试通过。
  • Shadow Verification 无新增失败。
  • 不引入新的 unwrap/expect(注意:该条亦已回升 3 处,见 D14)。

任务 C:生产代码 unwrap/expect 收敛(P2,预计 2 周)

目标:将生产路径中的 unwrap/expect 逐步替换为显式错误处理,降低运行时 panic 风险(原始目标为当时实测的 43 处)。

重点文件(2026-09-11 复核现状,对应 D14):

  • native/crates/vitro_typeck/src/decl.rs(3 处,当前唯一残留生产代码 unwrap:L44 / L65 init.take().unwrap()、L648 default.clone().unwrap())。
  • 历史目标(已清零):native/src/compiler/cfg.rs、native/crates/vitro_vm/src/core/executor/(原 native/src/vm/core/executor/)、native/src/compiler/data_flow.rs、native/crates/vitro_codegen/src/expr/call.rs、native/src/compiler/intent.rs——这些文件中现存的 unwrap/expect 均位于 #[cfg(test)] 测试代码内。
  • 已随前端切割移除:native/src/api/vitro.rs(原 4 处);其 apply_fix 本体已迁入语言中立的 native/src/diagnostics/auto_fix.rs。

执行步骤:

  1. 对这些文件逐函数审计,区分"确实不可失败"与"可能失败"的调用点。
  2. "确实不可失败"的调用添加注释说明不变量,保留 expect 并补充 #[allow(clippy::expect_used)]。
  3. "可能失败"的调用改为 match / if let / ? 传播,或转换为结构化诊断错误。
  4. 生产代码 unwrap/expect 曾于 2026-06-25 降至 0 处(unwrap_used 已为 deny);2026-09-11 复核实测回升至 3 处(native/crates/vitro_typeck/src/decl.rs,已于 D14 登记),需重新收敛。统计口径以 scripts/engineering_health 排除 #[cfg(test)] / #[test] 后的结果为准(脚本中的 frb_generated.rs 豁免项为前端时代残留,见 D15)。

验收标准:

  • ⚠️ 当前不满足:生产代码 unwrap/expect 实为 3 处(原「0 处」结论已过期);重新收敛至 0 处后,engineering_health.md 与维护计划数字需再次对齐。
  • ✅ cargo clippy --all-targets -- -D warnings 全绿(unwrap_used = deny 生效中)。
  • 新增错误路径均有单元测试覆盖。

任务 D:失败记录文件口径整理(P2,预计 1 周)

目标:澄清"活跃失败记录"统计口径,区分历史已修复条目与当前已知失败。

执行步骤:

  1. 统一 scripts/engineering_health 的统计口径:仅统计标记为 KNOWN_FAILURE / KNOWN_DIVERGENCE / KNOWN_LIMITATION 的条目。
  2. 在 KR_FAILURES.md 顶部明确说明:当前 0 个活跃已知失败,文件主体为历史修复记录。
  3. 修正 CPP_FAILURES.md 中"60 个 E2E 实际用例"的笔误,统一为 61 个。
  4. 检查其他 *_FAILURES.md 是否也存在类似口径不一致,统一修正。
  5. 2026-09-11 新增口径问题(待同步):CPP_FAILURES.md 现记「C++ E2E 74 个用例」,而 native/tests/cases/cpp/ 实际有 78 个 .cpp 文件(vitro_e2e.rs::load_cpp_cases 加载目录下全部 .cpp);两处数字需对账后统一。

验收标准:

  • engineering_health.md 中"活跃失败记录条目"数字与文件中 KNOWN_* 标记数一致。
  • 所有 *_FAILURES.md 数字口径与 TEST_REPORT.md 一致。
  • scripts/ci_three_tier_check 一致性检查通过。

任务 E:CI 与构建系统加固(P2)✅ 已完成(前端子项已随切割消解,wasm32 子项转入 Phase 2a)

目标:降低 CI 对 Windows-only runner 与 Flutter 工具 patch 的依赖,提升构建鲁棒性。

执行步骤(2026-09-11 口径改写):

  1. 对齐本地与 CI 的测试 / lint 命令 ✅:
    • 原入口 scripts/build_flutter.py --test 已随前端切割删除;现行本地与 CI 统一命令为 cargo test --workspace --all-features 与 cargo clippy --workspace --all-targets --all-features -- -D warnings(ci.yml 的 rust job 已如此执行)。
  2. Flutter generator 问题根治 ✅ 已随前端切割消解:scripts/patch_flutter_windows_generator.py 与相关 patch 需求随 Flutter 构建整体迁出(标签 before-frontend-split)。
  3. Android job 增加基础测试 ✅ 已随前端切割消解:ci.yml 已无 android / ios / flutter job,CI 收缩为纯后端 rust job。
  4. 依赖版本锁定 ✅:serde / serde_json / libm 已做小版本锁定(现行写法为 ~1.0.228 / ~1.0.149 / ~0.2.16)。
  5. binaryen/wasm-opt 稳定性(wasm 冒烟已于 2026-09-12 固化进 CI〔R4 G2〕;binaryen/wasm-opt 优化链未见——Rust 区冻结后随 MoonBit wasm-gc 出口另行裁定):
    • 将 binaryen 版本与 wasm-opt 参数文档化。
    • 考虑将 wasm-opt 步骤改为可选,避免阻塞主 CI。
    • 现状:wasm32-unknown-unknown 已冒烟实证(零修改构建 3.75MB),scripts/wasm_smoke/wasm_smoke.js 已固化并进 CI(2026-09-12 R4,见路线图 G2)。

验收标准(改写后):

  • ✅ CI 全绿且不依赖临时 patch(Flutter patch 需求已消失)。
  • ✅ 本地与 CI 使用同一套 cargo test / cargo clippy 命令(不再有 Flutter 构建脚本作为本地入口)。
  • ✅ wasm32 出口检查进 CI(2026-09-12 R4 G2 固化:scripts/wasm_smoke/wasm_smoke.js + ci.yml 构建/冒烟步骤);MoonBit 侧 wasm-gc 单出口已落地(2026-09-29 S7 批五号,Node 宿主 host.js 断言入 CI——优化链〔wasm-opt 等〕仍属后续裁定项)。

任务 F:性能收尾(P2,预计 2 周)

目标:完成 Phase 42 未完全落地的性能优化。

执行步骤:

  1. Dart Visualizer 缓存落地 ✅ 已随前端切割消解(前端资产,已迁出):
    • ✅ array_visualizer.dart 缓存 parsed numbers。
    • ✅ tree_visualizer.dart、linked_list_visualizer.dart 将 TextPainter 创建上提到 State 并复用,通过 saveLayer 应用动态透明度。
    • ✅ RepaintBoundary 已在动画组件就位。
    • ✅ shouldRepaint 已基于 nodes/isDark/progress 精确判定。
    • 以上成果随 CideFlutter/ 迁出(标签 before-frontend-split),本仓无对应验收对象。
  2. 统一模式差分编码落地(已完成,后端侧仍有效):
    • ✅ 变量级差分(var_deltas / new_vars / removed_var_name_indices)已在位。
    • ✅ 符号表全局去重字符串池已在位。
    • ✅ Dart 端大 batch(>50 units)切到 isolate 解码(Dart 侧已迁出,条目关闭)。
    • ✅ call_stack / vis_events / accessed_vars 改为 Option<Vec<T>>:无变化时不再全量传输。
    • ✅ array_snapshots / pointer_snapshots 实现按名索引的新增/替换/删除差分(removed_*_name_indices)。
    • 🚧 大对象(符号表、变量历史)分页或懒加载待进一步评估(后端侧)。
  3. 性能基线(后端已实测;前端项已随切割迁出):
    • ✅ 完成后端统一模式 10 万步基准实测:新增 native/benches/unified_perf_baseline.c(50 个逆序元素冒泡排序,约 10 万 VM 步)与 scripts/unified_perf_baseline.py,release 模式下后端吞吐约 18,500 步/秒,生成 reports/unified_perf_baseline.md。
    • ✅ 为支持长程序性能测试,UnifiedEngine 新增 with_max_steps 构造函数;vitro_cli unified 新增 --max-steps <n> 选项(默认 100_000)。
    • 📦 前端 55fps 回放基线(Flutter 桌面端 Release 实测:40 元素冒泡排序回放 5 秒,等效 FPS 825.1;报告 reports/frontend_fps_baseline.md)为前端资产历史成果,已迁出,不再由本仓验收(报告文件仍留在 reports/ 作为历史记录)。

验收标准(改写后):

  • ✅ cargo test --workspace --all-features 与后端 Shadow 防线全绿(依据 2026-09-11 批次 H 记录:全量 0 failed、clippy 全绿、C Shadow 636 例 0 非预期差异、C++ Shadow 0 非预期差异、serve 冒烟通过);原「flutter test」验收项随前端迁出,条目关闭。
  • 📦 复杂可视化场景帧率 ≥55fps —— 前端指标,已随前端切割迁出并冻结,不再由本仓验收。
  • ✅ 10 万步统一模式后端无明显卡顿与内存泄漏(后端基线实测约 18,500 步/秒)。

任务 G:教学场景与内容深化(P3,持续推进)

目标:在工程加固基础上,扩展教学内容与真实场景覆盖。

执行步骤:

  1. LeetCode 逐步填充:在 0~30 道中等题目标达成后,继续 all in 混合难度题目。✅ 2026-06-18 新增 15 道混合难度题(含 5 道困难题),当时 LeetCode 用例总数 92 道,均通过 Shadow Verification(截至 2026-09-11:native/tests/cases/leetcode/ 共 138 道,全绿)。
  2. K&R 进阶章覆盖:
    • ✅ 第 7 章 7 个用例(kr_7_1~kr_7_7)已纳入,当时 K&R 防线扩展至 76/76 全绿(截至 2026-09-11:native/tests/cases/knr/ 共 81 个用例,全绿)。
    • ⚠️ 第 8 章(UNIX 系统接口)因 Vitro 教学子集不支持 POSIX 系统调用(read/write/open/close/unlink/lseek/opendir 等),原始习题无法直接适配。可适配部分(如 8-7 自己实现 malloc/free)与 Vitro 内置内存管理冲突,且失去教学对比意义。结论:第 8 章暂不纳入常规回归测试,作为文档中的已知限制保留;后续可考虑编写使用 Vitro VFS 接口的变体用例,但不强求覆盖。
  3. 学生常见错误用例库扩展:基于 docs/current/04-标准库与防线/学生错误用例集.md 持续补充。
  4. 诊断知识卡片扩展:针对 C++ 常见错误(内存泄漏、悬垂引用、对象切片、浅拷贝双重释放、引用绑定临时对象)新增知识卡片。

本次推进记录(2026-06-18):

  • 第一批新增 5 道 LeetCode 中等题源码与 golden:
    • lc_3 Longest Substring Without Repeating Characters
    • lc_33 Search in Rotated Sorted Array
    • lc_48 Rotate Image
    • lc_62 Unique Paths
    • lc_64 Minimum Path Sum
  • 第二批新增 5 道 LeetCode 中等题源码与 golden:
    • lc_2 Add Two Numbers
    • lc_11 Container With Most Water
    • lc_19 Remove Nth Node From End of List
    • lc_31 Next Permutation
    • lc_34 Find First and Last Position of Element in Sorted Array
  • 第三批新增 5 道 LeetCode 中等题源码与 golden:
    • lc_15 3Sum
    • lc_39 Combination Sum
    • lc_46 Permutations
    • lc_75 Sort Colors
    • lc_198 House Robber
  • 第四批新增 5 道 LeetCode 中等题源码与 golden:
    • lc_55 Jump Game
    • lc_142 Linked List Cycle II
    • lc_152 Maximum Product Subarray
    • lc_200 Number of Islands
    • lc_221 Maximal Square
  • 第五批新增 5 道 LeetCode 中等题源码与 golden:
    • lc_49 Group Anagrams
    • lc_56 Merge Intervals
    • lc_78 Subsets
    • lc_102 Binary Tree Level Order Traversal
    • lc_139 Word Break
  • 第六批新增 5 道 LeetCode 中等题源码与 golden:
    • lc_153 Find Minimum in Rotated Sorted Array
    • lc_162 Find Peak Element
    • lc_300 Longest Increasing Subsequence
    • lc_394 Decode String
    • lc_560 Subarray Sum Equals K
  • 第七批新增 15 道 LeetCode 混合难度题源码与 golden(7 困难 / 7 中等 / 1 简单):
    • lc_4 Median of Two Sorted Arrays(困难;实现中发现 Vitro 函数返回 double 值异常,已改用整数返回值通过)
    • lc_23 Merge k Sorted Lists(困难)
    • lc_25 Reverse Nodes in k-Group(困难)
    • lc_42 Trapping Rain Water(困难)
    • lc_45 Jump Game II(中等)
    • lc_53 Maximum Subarray(简单)
    • lc_73 Set Matrix Zeroes(中等)
    • lc_76 Minimum Window Substring(困难)
    • lc_84 Largest Rectangle in Histogram(困难)
    • lc_91 Decode Ways(中等)
    • lc_98 Validate Binary Search Tree(中等)
    • lc_124 Binary Tree Maximum Path Sum(困难)
    • lc_146 LRU Cache(中等)
    • lc_207 Course Schedule(中等)
    • lc_322 Coin Change(中等)
  • 修复发现的问题:JIT 统计信息原通过 output_lines 混入用户 stdout,导致 lc_3 在 Shadow Verification 中出现 output_gap。已移除该输出并新增 vitro_get_jit_stats C API,jit_unit_test.rs 改为通过 API 验证 JIT。
  • 诚实记录的新发现:lc_4 原始实现使用 double findMedianSortedArrays(...) 返回值时,Vitro VM 输出全为 0.00000,与 Clang 行为不一致。已改用整数返回值(结果 × 100000)规避,并在 AGENTS.md / LEETCODE_FAILURES.md 中记录该限制。
  • C Shadow Verification 从 549/555 更新为 555/562,C++ Shadow Verification 保持 83/83。
  • 2026-06-25 修复 double 函数返回值异常:vitro_typeck::decl.rs 在 return 语句 check_assignable 成功后调用 insert_implicit_cast;新增 baseline/float_func_return.c 回归用例;lc_4.c 恢复为原始 double 返回实现;C Shadow Verification 更新为 556/563。
  • 新增 C++ 教学知识卡片:在 native/crates/vitro_shared/src/error_codes.rs 与 native/src/diagnostics/error_catalog.rs 中新增 E4100~E4106:
    • E4100:C++ 内存泄漏(new 未 delete)
    • E4101:C++ 悬垂引用(返回局部变量引用)
    • E4102:C++ 对象切片(派生类赋值给基类值对象)
    • E4103:C++ unique_ptr 所有权混乱
    • E4104:C++ move 后继续使用源对象
    • E4105:C++ 隐式浅拷贝导致双重释放
    • E4106:C++ 引用绑定到临时对象
  • 扩展学生错误用例库:在 docs/current/04-标准库与防线/学生错误用例集.md 中新增 9.1~9.7 七个 C++ 常见错误教学用例。

本次推进记录(2026-06-26):

  • 第八批新增 15 道 LeetCode 混合/简单/中等题源码与 golden:
    • lc_16 3Sum Closest
    • lc_17 Letter Combinations of a Phone Number
    • lc_22 Generate Parentheses
    • lc_24 Swap Nodes in Pairs
    • lc_29 Divide Two Integers
    • lc_38 Count and Say
    • lc_40 Combination Sum II
    • lc_50 Pow(x, n)
    • lc_54 Spiral Matrix
    • lc_168 Excel Sheet Column Title
    • lc_242 Valid Anagram
    • lc_509 Fibonacci Number
    • lc_704 Binary Search
    • lc_746 Min Cost Climbing Stairs
    • lc_977 Squares of a Sorted Array
  • K&R 防线补充 5 个变体/基础用例:
    • kr_1_hello Hello World
    • kr_2_celsius 摄氏度转华氏度
    • kr_4_atoi 自定义 atoi
    • kr_5_itoa 自定义 itoa(含 reverse)
    • kr_6_getword 基于 getchar/ungetc/ctype 的单词读取
  • C++ E2E 防线补充 9 个 Stage 0~6 用例:
    • cpp_pair_template 多类型参数模板类
    • cpp_template_func_multi 函数模板多类型实例化
    • cpp_reference_member 成员函数返回引用并作为左值赋值
    • cpp_template_array 模板类固定大小数组
    • cpp_template_stack 模板类栈
    • cpp_unique_ptr_reset unique_ptr reset 语义
    • cpp_class_array 类对象数组(stdout 不依赖析构计数)
    • cpp_ctor_init_list 构造函数初始化列表
    • cpp_reference_param_chain 引用参数链式修改
    • cpp_function_overload_template 普通函数与函数模板共存
  • 探索用例 cpp_move_semantics 因触发 Vitro 内存泄漏报告(移动构造后源对象未正确标记 region 转移),未纳入 E2E,已删除
  • 诚实记录的新发现:Vitro C++ 子集当前不支持类类型作为模板实参传入 vector<T> / list<T>(push_back 无法匹配以类为参数的构造函数),也不支持非类型模板参数、嵌套类 Outer::Inner 实例化、const 引用参数、默认参数、自定义拷贝构造等特性。这些用例未纳入 E2E/Shadow。(注:vitro_list<T> 类类型模板实参与 const T& 参数绑定右值已于后续 4.40 支持)
  • C Shadow Verification 更新为 585/589,C++ Shadow Verification 更新为 93/93;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿。

本次推进记录(2026-06-26 继续 all in):

  • 第九批新增 10 道 LeetCode 简单题源码与 golden:
    • lc_7 Reverse Integer
    • lc_83 Remove Duplicates from Sorted List
    • lc_190 Reverse Bits
    • lc_191 Number of 1 Bits
    • lc_202 Happy Number
    • lc_205 Isomorphic Strings
    • lc_231 Power of Two
    • lc_263 Ugly Number
    • lc_292 Nim Game
    • lc_389 Find the Difference
  • lc_412 Fizz Buzz 同步更新 golden
  • LeetCode 防线扩展至 118 题;C Shadow Verification 更新为 596/600,C++ Shadow Verification 保持 93/93;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿。

本次推进记录(2026-06-26 继续 all in 第二批):

  • 第十批新增 10 道 LeetCode 简单题源码与 golden:
    • lc_67 Add Binary
    • lc_219 Contains Duplicate II
    • lc_345 Reverse Vowels of a String
    • lc_349 Intersection of Two Arrays
    • lc_367 Valid Perfect Square
    • lc_383 Ransom Note
    • lc_392 Is Subsequence
    • lc_401 Binary Watch
    • lc_409 Longest Palindrome
    • lc_415 Add Strings
  • LeetCode 防线扩展至 128 题;C Shadow Verification 更新为 606/610,C++ Shadow Verification 保持 93/93;cargo test --workspace --all-features / cargo clippy --workspace --all-targets --all-features -- -D warnings / cargo fmt --check / flutter analyze / flutter test 全绿。

验收标准:

  • ✅ 新增 30 道中等题及额外 15 道混合难度题均通过 Shadow Verification 与 cargo test test_vitro_e2e_leetcode。
  • ✅ 知识卡片覆盖 C++ Stage 0~6 常见错误(E4100~E4106)。

任务 H:AGENTS.md 已知限制逐项修复(P2,持续推进)

目标:按优先级逐个修复 AGENTS.md 中记录的已知限制与行为差异,缩小 Vitro 与 Clang 的行为差距,提升教学子集真实场景可用性。

当前已知限制清单(来自 AGENTS.md):

编号 限制项 类型 优先级 状态
H01 参数化宏调用后带分号无法解析 不支持(已扩展支持,与 Clang 有差异) P2 ✅ 已修复
H02 VLA 边界检查缺失 不支持 P2 ✅ 已修复
H03 #include 非标准库路径 不支持 P3 ✅ 已修复
H04 va_list / va_start / va_arg / va_end 不支持(已扩展支持) P3 ✅ 已修复
H05 全局 VLA 标准限制 P3 ✅ 无需修复(Clang 同样报错)
H06 复合副作用数组索引触发 NULL 指针陷阱 行为差异 P1 ✅ 已修复
H07 函数返回 double 值异常 行为差异 P1 ✅ 已修复
H08 scanf 的 %s 格式符不支持 行为差异 P1 ✅ 已修复
H09 fputs(str, stdout) 无输出 行为差异 P1 ✅ 已修复
H10 fclose 后 VFS FILE* 仍报告内存泄漏 行为差异 P2 ✅ 已修复

执行步骤:

  1. 对每个限制项建立最小复现用例,确认根因范围(Lexer/Parser/TypeChecker/BytecodeGen/VM)。
  2. 评估修复成本与教学价值,优先处理 P1 行为差异(影响 Shadow Verification 用例覆盖与真实代码迁移)。
  3. 修复后补充回归用例,更新 AGENTS.md 与 CHANGELOG.md [Unreleased]。
  4. 对暂无法修复的限制项,在 AGENTS.md 中保留诚实记录,并在本任务清单中标注原因。

验收标准:

  • 每修复一项,C/C++ Shadow Verification 无新增失败。
  • 新增回归用例通过 cargo test --workspace --all-features。
  • AGENTS.md 与 CHANGELOG.md 同步更新。

本次推进记录(2026-06-25):

  • H06 复合副作用数组索引触发 NULL 指针陷阱(P1):crates/vitro_codegen/src/expr/unary.rs 的 gen_mem_inc_dec 改用 temp_slot3 保存新值,避免与 gen_assign 的 Index 赋值复用 temp_slot0;新增 baseline/side_effect_index.c 回归用例。
  • H07 函数返回 double 值异常(P1):vitro_typeck::decl.rs 在 return 语句 check_assignable 成功后调用 insert_implicit_cast;新增 baseline/float_func_return.c 回归用例;lc_4.c 恢复为原始 double 返回实现。
  • H08 scanf/sscanf 的 %s 格式符不支持(P1):crates/vitro_vm/src/host/io.rs 的 host_scanf_n/host_sscanf 新增 's' 分支处理;新增 baseline/scanf_string.c 回归用例。
  • H01 参数化宏调用后带分号无法解析(P2):vitro_lexer::expand_macros_inner 在参数化宏展开时,若宏体为大括号块且调用位置后紧跟分号,则动态将宏体包装为 do { ... } while(0),使 SWAP(int,x,y); 在 if/else 等语句中可正确解析;新增 end_to_end_extra_test::test_e2e_parametric_macro_swap_semicolon 回归测试。诚实记录此为 Vitro 教学子集扩展,Clang 标准模式对未包装的 { ... }; 形式仍会报错。
  • H02 VLA 数组索引缺失边界检查(P2):vitro_codegen::expr::gen_index 对首维为变量表达式的 VLA 生成运行时边界检查;新增 TrapBoundsVla opcode(值为 129),索引前将 VLA 维度表达式求值并压栈;vitro_vm::core::executor::debug.rs 在 VM 运行时将索引与运行时边界比较,越界时触发教学诊断;新增 baseline/vla_bounds.c 回归用例。参数退化为指针的 VLA 形参仍无法在调用点获知边界,保持跳过。
  • H10 fclose 后 VFS FILE* 被误报为内存泄漏(P2):新增 vitro_runtime::MemoryState::free_region 方法;crates/vitro_vm/src/host/file.rs 的 host_fclose 在关闭 VFS 文件描述符后调用 session.memory.free_region(stream),释放 host_fopen 为 FILE* 结构体分配的 4 字节内存;stdout/stderr 等非堆分配 stream 找不到对应 region 时安全忽略;vfs.rs 的 free_raw 改为复用 MemoryState::free_region;新增 baseline/fclose_leak.c 回归用例。
  • H03 #include 非标准库路径(P3):vitro_lexer::Lexer 新增 base_path 字段与 with_mode_and_path 构造函数;compile_pipeline.rs 从首个编译单元文件名提取目录作为 base_path;preprocessor.rs 在 load_stub 失败后调用 load_include_file 从 base_path 读取自定义头文件;自定义头文件内容保留原始换行以支持 #ifndef / #define / #endif 等预处理指令。shadow_verify.py 与 vitro_e2e.rs 改用真实源文件路径调用 vitro_compile_unit,保证 Shadow Verification 与 E2E 测试中的 include 行为与 Clang 一致。新增 baseline/include_custom_header.c / include_custom_header.h 回归用例。绝对路径、系统 include 搜索路径(<> 非标准库)及递归 include 仍待扩展。
  • H04 va_list / va_start / va_arg / va_end 自定义变参函数(P3):根因是 Parser 把所有函数调用解析为 Expr::CallPtr,而 CallVar 指令只在 gen_call 中生成,变参数据未被写入栈帧。修复方案:
    • vitro_codegen::expr::call 在 gen_call 与 gen_call_ptr 中同步识别变参函数,生成 PushConst total_arg_words + CallVar;total_arg_words 按实参真实 type_size 折算 word 数,支持 double / long long 等 8 字节类型。
    • 调用方对 8 字节变参实参直接按小端布局顺序压栈,不再依赖 SplitD/SplitQ,__vitro_va_arg 返回对应地址,宏展开为 *(type*)__vitro_va_arg(...) 按目标类型位模式读取。
    • vitro_typeck::decl 对超出命名参数的变参实参应用 C 默认实参提升(float→double、char/short→int)。
    • 附带修复:vitro_codegen::expr::cast 重写 gen_expr_with_cast,以目标 Type 选择转换指令,修复 long long 目标被错误截断为 int;vitro_codegen::expr::assign 修复复合赋值对 long long 使用 32 位运算的问题。
    • 新增 baseline/variadic.c 回归用例,覆盖 int / double / long long 三种类型的自定义变参求和;修复 ast_unit_test.rs、b10_new_array_rollback.rs 中因新增 is_variadic 字段导致的编译错误。
  • H05 全局 VLA(P3):按 C99 标准评估,文件作用域 VLA 被明确禁止(Clang 报 "variable length array declaration not allowed at file scope")。Vitro 保持不支持,与标准一致,无需修复;已在 AGENTS.md 中明确记录。
  • P1/P2 行为差异与 H01~H05 已全部处理,H04 自定义变参函数已修复,H05 明确为标准限制无需修复;AGENTS.md 已知限制清单全部处理完毕。

8.3 执行节奏与里程碑

阶段 时间 里程碑 关键交付物
任务 A 第 1~4 周 ✅ Workspace 拆分进入平台期(FRB 阻碍已消失) workspace 已建立;10 个核心 crate 已独立(含新增 vitro_algorithm_steps);CheckpointManager 已下沉到 vitro_vm::snapshot;unified/engine/diagnostics 仍保留在 vitro_native 内部(native/src/api/ 已随前端切割删除);FRB 已移除,原孤儿规则阻碍消失,上述模块的拆分可重新评估(尚未执行;Rust 区冻结后不再执行,等价结构已由 MoonBit 侧 L0–L9 包切分重建),剩余阻力为 Session 耦合
任务 B 第 3~5 周 ✅ 超大文件拆分完成(1 处超标,见 D16) 核心文件均 ≤800 行、测试全绿(例外:native/crates/vitro_typeck/src/decl.rs 871 非空行,2026-09-11 复核超标);cpp_monomorph/ 1443 → 18 行入口 + 7 个子模块(func.rs / class.rs / replace.rs / synth.rs / builtin.rs / builtin_vec.rs / builtin_list.rs);trace_analyzer.rs 838 → 55 行入口 + 7 个子模块(bounds.rs / use_after_free.rs / double_free.rs / div_zero.rs / null_deref.rs / utils.rs / tests.rs)
任务 C 第 5~6 周 ⚠️ unwrap/expect 收敛回升(D14) 生产路径曾于 2026-06-25 降至 0 处、unwrap_used 已为 deny;2026-09-11 复核实测回升至 3 处(native/crates/vitro_typeck/src/decl.rs)
任务 D 第 5 周 ✅ 失败记录口径统一(新增 1 项待对账) engineering_health.md 数字口径一致、文档修正;遗留:CPP_FAILURES.md 74 vs 实际 78 个 C++ E2E 用例待同步
任务 E 第 6~8 周 ✅ CI 与构建加固完成(前端子项已消解) 本地/CI 命令对齐(cargo test/clippy)、依赖锁定;Flutter patch 脚本化与 Android Dart 测试随前端切割消解;wasm32 冒烟已于 2026-09-12 固化 scripts/wasm_smoke/ 并进 CI(R4,见路线图 G2)
任务 F 第 7~8 周 ✅ 性能收尾完成(前端项已迁出) 后端:array/pointer/call_stack/accessed_vars/vis_events 全字段差分完成,10 万步基线约 18,500 步/秒;前端 Visualizer 缓存与 55fps 回放基线(FPS 825.1)为前端历史成果,已随切割迁出
任务 G 第 9 周起持续 ✅ 教学场景扩展推进 LeetCode 扩展至 138 道(新增 lc_16 / lc_17 / lc_22 / lc_24 / lc_29 / lc_38 / lc_40 / lc_50 / lc_54 / lc_168 / lc_242 / lc_509 / lc_704 / lc_746 / lc_977 / lc_7 / lc_67 / lc_83 / lc_190 / lc_191 / lc_202 / lc_205 / lc_219 / lc_231 / lc_263 / lc_292 / lc_345 / lc_349 / lc_367 / lc_383 / lc_389 / lc_392 / lc_401 / lc_409 / lc_415 / lc_257 / lc_290 / lc_326 / lc_404 / lc_448 / lc_496 / lc_617 / lc_36 / lc_150 / lc_199);K&R 扩展至 81 个用例(新增 kr_1_hello / kr_2_celsius / kr_4_atoi / kr_5_itoa / kr_6_getword);C++ E2E 新增 cpp_pair_template / cpp_template_func_multi / cpp_reference_member / cpp_template_array / cpp_template_stack / cpp_unique_ptr_reset / cpp_class_array / cpp_ctor_init_list / cpp_reference_param_chain / cpp_function_overload_template / cpp_vitro_vec_class / cpp_vitro_list_class(2026-09-11 实测目录内共 78 个 .cpp,原记 73/74 待对账);2026-09-11 复测:C Shadow Verification 636/636(完全匹配 617 + vitro_better 16 + known_issue 3,0 非预期差异),C++ Shadow Verification 98/100(2 个已记录 clang_compile_fail)
任务 H 持续推进 ✅ AGENTS.md 已知限制清单全部处理完毕 H01 参数化宏分号(扩展支持)、H02 VLA 边界检查、H03 自定义头文件 #include "..."、H04 va_list 变参函数、H05 全局 VLA(标准限制无需修复)、H06 复合副作用数组索引、H07 函数返回 double、H08 scanf %s、H09 fputs(stdout)、H10 fclose FILE* 泄漏误报均已处理;无剩余待修复项

8.4 质量保证

每项任务必须通过以下验证:

  1. cd native && cargo test --workspace --all-features 全绿。
  2. cargo clippy --all-targets -- -D warnings 全绿。
  3. cargo fmt --check 通过。
  4. C/C++ Shadow Verification 无新增失败。
  5. 出口 3 协议冒烟:go run ./scripts/serve_smoke 通过(CI 已执行)。
  6. 出口 2 构建:cargo build --target wasm32-unknown-unknown --release 通过(Phase 2a 起进 CI)。
  7. CI 全量 workflow 通过。

8.5 风险与回退策略

风险 回退策略
Workspace 拆分导致编译失败 小步迁移,每次只迁一个 crate;失败时回滚该 crate
FRB 导出类型跨 crate 触发孤儿规则 风险已消失(2026-09-11 FRB 移除);unified/diagnostics/engine 的拆分可重新评估(尚未执行;Rust 区冻结后不再执行,等价结构已由 MoonBit 侧 L0–L9 包切分重建),新风险为 Session 上帝对象耦合 —— 先抽 vitro_session 再迁移
unwrap 收敛引发大量错误路径变更 先 warn 后 deny,分阶段提升;必要时使用 #[allow] 并附注释。注意 D14:生产代码 unwrap/expect 已回升至 3 处,需重新收敛
CI patch 移除后 Flutter Windows 构建失败 已随前端切割消解(Flutter 构建脚本与 patch 需求迁出,标签 before-frontend-split);wasm32 冒烟已进 CI(2026-09-12 R4)——Rust wasm 线随区冻结维持现状
性能优化引入状态不一致 增加统一模式回归测试,对比全量状态与增量状态等价性
教学用例扩展暴露新差异 诚实记录为 KNOWN_*,禁止修改 golden 粉饰数据

本方案应与 AGENTS.md、CHANGELOG.md、代码审阅与修复追踪20260906.md(已归档的历史修复追踪——Rust 区冻结后活跃缺陷由 GitHub issue 体系承接)共同维护,任何新发现的工程债务应及时追加到本方案中(编号延续 #DXX,不重排)。