最后核对: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 条目为历史口径(tagrust-oracle-freeze可回溯)。 2026-09-27 冻结态注记〔——已被上条删区终局取代〕:native/Rust 区已冻结为差分对照 oracle(tagrust-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 核心原则
- 功能优先:所有重构必须保证现有测试防线全绿,禁止以偿还债务为名破坏功能。
- 最小侵入:每次变更只处理一个明确的债务点,避免大范围重写。
- 诚实记录:重构过程中发现的新问题必须立即记入对应
*_FAILURES.md或新增 TODO 标记。 - 持续集成:任何拆分或重构必须通过 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&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.mdAGENTS.mdCHANGELOG.mdnative/tests/TEST_REPORT.mdreports/three_tier_report.md(如存在)
- 执行步骤:
- 运行
go run ./scripts/shadow_verify获取最新实测数据。 - 运行
go run ./scripts/shadow_verify_cpp获取最新 C++ 数据(Python 版已随 D5 退役)。 - 运行
go run ./scripts/serve_smoke获取 serve 冒烟断言数(自报口径)。 - 统计当前真实匹配数、编译缺口数、运行时缺口数、输出差异数。
- 统一所有文档中的数字,注明统计日期与工具版本。
- 运行
- 验收标准:所有文档中 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 校验口径改写(纯后端三出口):
- 出口 3(serve):
go run ./scripts/serve_smoke—— 已在 CI(ci.yml「vitro_cli serve smoke (Exit 3 protocol contract)」步骤)。 - 出口 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。 - 出口 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 依赖)。
- 出口 3(serve):
- 验收标准(改写后):
git ls-files | grep -i frb_generated无输出(生成物与依赖均已移除)。- CI 的
rustjob 全绿,含 serve 冒烟与 Shadow 门禁。 - wasm32 出口检查在 Phase 2a 进 CI 前,由维护者手工执行并在
CHANGELOG.md记录结果。
- 风险:无(对象已删除);历史产物可取回 —— 标签
before-frontend-split。
任务 1.3:归档或清理已修复的失败记录条目
- 涉及文件:
FUZZ_FAILURES.mdHOST_CONTRACT_FAILURES.mdBYTECODE_LIBC_FAILURES.mdDIFFERENTIAL_FAILURES.mdGOLDEN_FAILURES.md
- 执行步骤:
- 遍历各失败记录文件,识别标记为“已修复”的条目。
- 将已修复条目迁移至
docs/archive/failures_archive_2026.md,保留历史轨迹。- ⚠️ 2026-09-11 核对:该归档文件至今不存在(
docs/archive/下无failures_archive_2026.md), 即本步骤尚未执行,各*_FAILURES.md仍同时承载历史与活跃条目——如实记录为此任务的未完成项。
- ⚠️ 2026-09-11 核对:该归档文件至今不存在(
- 在活跃失败记录文件中仅保留当前已知失败与边界说明。
- 更新
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[]
- 保留
- 执行步骤:
- 提取
gen_expr内部的 match 分支到各子模块。 - 保持
BytecodeGenstruct 不变,子模块通过impl BytecodeGen添加方法。 - 每拆分一个子模块,运行
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、模板、构造析构、引用)
- 保留
- 执行步骤:
- 将
parse_xxx方法按主题迁移到子模块。 - 在
parser/mod.rs中pub use需要的函数。 - 处理 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/calloccrates/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等
- 保留
- 执行步骤:
- 将 host 函数按功能迁移。
- 提取共享工具如
parse_format_spec、write_memory到vm/host/utils.rs。 - 更新
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:键盘与快捷键处理
- 保留
- 执行步骤:
- 识别
ide_screen.dart中可独立的状态块。 - 使用
Consumer/ref.watch保持状态订阅。 - 每提取一个 widget,运行
flutter test与flutter analyze验证。
- 识别
- 验收标准:
ide_screen.dart行数降至 300 行以内。flutter analyze0 issues。- 集成测试通过。
- 风险:拆分过程中可能破坏状态监听链路,需通过集成测试捕获。
第三阶段:规范与质量加固(P2,预计 2 周)
目标:建立项目级 lint 配置、代码内问题追踪机制,优化前端性能热点。
任务 3.1:建立项目级 Clippy 配置
- 涉及文件:
native/Cargo.toml或新建native/clippy.toml- 各模块源码
- 执行步骤:
- 在
Cargo.toml中声明[lints.clippy]规则,例如:unwrap_used = "deny"expect_used = "warn"missing_panics_doc = "warn"too_many_lines = "warn"type_complexity = "allow"(如现有类型确实复杂)
- 逐步修复新增 lint 报错,优先处理高优先级模块。
- 对暂时无法修复的地方添加显式
#[allow(...)]并附注释说明原因。
- 在
- 验收标准:
cargo clippy --all-targets -- -D warnings仍然全绿;新增 lint 规则生效。 - 风险:
unwrap_used可能导致大量报错,建议先设为warn,分阶段提升为deny。
任务 3.2:引入代码内 TODO/FIXME 追踪规范
- 涉及文件:全项目
- 执行步骤:
- 制定注释规范:
// TODO(#<issue>): 说明:已知待改进点// FIXME(#<issue>): 说明:已知缺陷// HACK: 说明:临时 workaround// NOTE: 说明:重要设计决策
- 扫描现有代码,补充关键位置的 TODO/FIXME 标记。
- 在 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(前端资产,已迁出)
- 执行步骤:
- 对
TextPainter、ParagraphBuilder、Gradient、Blur等对象实施缓存,仅在文本/数据变化时重建。 - 为动画组件添加
RepaintBoundary隔离重绘区域。 - 使用
shouldRepaint精确控制重绘。 - 在桌面端与移动端分别进行性能测试(观察帧率、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(前端资产,已迁出)
- 执行步骤:
- 评估当前
StepPayload/StepPayloadDelta字段必要性,剔除冗余字段(后端,仍有效)。 - 对符号表、变量历史等大对象启用增量更新或分页(后端,仍有效)。
在 Dart 端使用(前端资产,已迁出,条目关闭)。compute或 isolate 处理大状态反序列化- 增加状态大小日志,监控异常增长(后端,仍有效)。
- 评估当前
- 验收标准:
- 10 万步统一模式下后端吞吐与内存表现有界(原「前端仍保持流畅」为前端指标,随前端迁出不再由本仓验收)。
- 内存占用无明显增长。
- 风险:增量更新逻辑复杂,可能引入状态不一致。
第四阶段:C++ 扩展模块化(P3,预计 4 周)
目标:降低 C++ 扩展在 Parser/TypeChecker/CodeGen 中的耦合度,减少回归风险。
任务 4.1:建立 C++ 语法专属解析模块
- 涉及文件:
crates/vitro_parser/src/cpp.rs(新建)crates/vitro_parser/src/lib.rs
- 执行步骤:
- 将 C++ class、模板、构造析构、引用等语法解析逻辑集中到
parser/cpp.rs。 - 在
parser/mod.rs中通过parse_cpp_xxx调用入口。 - 保持 C 解析路径不被 C++ 逻辑污染。
- 将 C++ class、模板、构造析构、引用等语法解析逻辑集中到
- 验收标准:C 解析模块中不出现
Class、Template、Reference等 C++ 专属分支。
任务 4.2:建立 C++ 类型检查模块边界
- 涉及文件:
crates/vitro_typeck/src/cpp/crates/vitro_typeck/src/lib.rs
- 执行步骤:
- 将 C++ 类布局、方法解析、重载、引用语义迁移到
typeck/cpp/子模块。 - 明确 C++ typeck 与 C typeck 的调用边界。
- 提取公共工具函数到
typeck/cpp/utils.rs。
- 将 C++ 类布局、方法解析、重载、引用语义迁移到
- 验收标准:
typeck/mod.rs对 C++ 逻辑的依赖通过明确接口完成。
任务 4.3:建立 C++ 字节码生成模块边界
- 涉及文件:
crates/vitro_codegen/src/cpp/crates/vitro_codegen/src/expr.rs/stmt/
- 执行步骤:
- 将 C++ 构造析构调用、方法调用、引用处理、移动构造等逻辑迁移到
codegen/cpp/。 - 在通用
gen_expr/gen_stmt中通过类型判断分派到 C++ 处理模块。
- 将 C++ 构造析构调用、方法调用、引用处理、移动构造等逻辑迁移到
- 验收标准:C++ 代码生成变更不再扩散到通用表达式生成逻辑。
任务 4.4:C++ 容器布局维护流程固化
- 涉及文件:
native/runtime_libc/vitro/*.cppscripts/extract_cpp_builtin_layout.pycrates/vitro_cpp_frontend/src/builtin_layout_data.json
- 执行步骤:
- 文档化容器新增流程:编辑
.cpp→ 运行提取脚本 → 验证 JSON → 跑测试。 - 在 CI 中增加
.cpp接口声明的语法检查(clang++ -fsyntax-only)。 - 确保 Rust 代码中不再新增硬编码容器信息。
- 文档化容器新增流程:编辑
- 验收标准:新增容器必须仅修改
.cpp与脚本,无需改动 Rust 源码。
第五阶段:长期健康度维护(P4,持续推进)
目标:保持文档整洁、监控工程健康度、持续消除小额债务。
任务 5.1:定期清理 docs/archive/
- 执行步骤:
- 每季度 review
docs/archive/,删除无价值的历史交互文本。 - 对保留的归档文档添加摘要说明,便于后续检索。
- 每季度 review
- 验收标准:
docs/archive/体积季度环比下降或保持稳定。
任务 5.2:建立工程健康度看板 ✅ 已完成
- 执行步骤:
- 新增
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++)
- 各 Rust 源文件行数 Top 20(Dart 项随前端切割归零:脚本现只扫描
- 生成报告到
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消费,名称待后续重构收敛;仍存在于本仓,非前端资产) - 执行步骤:
- 在 poison 恢复路径增加日志记录。
- 评估是否需要 panic 而非恢复默认值。
- 增加指标或测试覆盖 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 每个任务必须通过的验证
- 单元测试:
cd native && cargo test --workspace --all-features全绿。 - Lint:
cargo clippy --all-targets -- -D warnings全绿。 - 格式化:
cargo fmt --check通过。 - Shadow Verification:C/C++ Shadow Verification 无新增失败。
- 出口 3 协议冒烟:
go run ./scripts/serve_smoke通过(CI 已执行)。 - 出口 2 构建:
cargo build --target wasm32-unknown-unknown --release通过(Phase 2a 起进 CI)。 - 集成测试: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 阻碍已消失,边界需重新界定) |
执行步骤:
- ✅ 在
native/Cargo.toml中建立 workspace,已迁移vitro_shared(SourceLoc)与vitro_ast(AST/类型系统)。 - ✅ 拆分
vitro_runtime:下沉func_meta/symbol/type_utils、RuntimeState/MemoryState及依赖类型、内存布局常量、unified_types基础数据;session.rs改为带#[frb]类型的薄包装层 + re-export(#[frb]标记已于 2026-09-11 前端切割时清除,native/src/session.rs仍为本仓语言中立会话状态)。 - ✅ 拆分
vitro_vm:将native/src/vm/完整迁移到crates/vitro_vm;引入VmContext替代Session上帝对象,打破vm与session的循环依赖;vitro_native通过pub use vitro_vm as vm;保持路径兼容。 - ✅ 拆分
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;保持路径兼容。 - ✅ 拆分
vitro_parser:将native/src/compiler/parser/全部 10 个文件完整迁移到crates/vitro_parser;vitro_shared新增SourceLocre-export;vitro_native通过pub use vitro_parser as parser;保持路径兼容。 - ✅ 拆分
vitro_cpp_frontend:将native/src/compiler/cpp_frontend/完整迁移到crates/vitro_cpp_frontend;vitro_native通过pub use vitro_cpp_frontend as cpp_frontend;保持路径兼容。 - ✅ 拆分
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;保持路径兼容。 - ✅ 拆分
vitro_codegen:将native/src/compiler/codegen/全部 26 个文件完整迁移到crates/vitro_codegen;下沉vitro_vm::opcode/vitro_vm::instruction与内存布局常量到vitro_runtime,切断codegen对vitro_vm的直接依赖。 - ✅ 拆分
vitro_algorithm_steps:将native/src/unified/algorithm_steps/完整迁移为独立 crate;通过AlgorithmContexttrait 解耦对Session的依赖;vitro_native通过pub use vitro_algorithm_steps as algorithm_steps;保持crate::unified::algorithm_steps路径兼容。 - ✅ 迁移
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调用点。 - ⚠️
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」的顺序推进,工程量大,不在文档翻新范围内强制启动。
- ⚠️
vitro_diagnostics暂保留在vitro_native内部:FRB 已移除,原有孤儿规则阻碍已消失,可重新评估(尚未执行;Rust 区冻结后不再执行,等价结构已由 MoonBit 侧 L0–L9 包切分重建);当前主要阻力是其与Session/诊断上下文的耦合。 - 每迁移一个 crate,执行
cargo test --workspace --all-features与 Shadow Verification 验证无回归。 - 评估
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。 含—— 该风险已随 2026-09-11 FRB 移除而消失。当前拆分风险转为:#[frb]导出类型的模块(如diagnostics)拆分为独立 crate 会触发 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 / L65init.take().unwrap()、L648default.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。
执行步骤:
- 对这些文件逐函数审计,区分"确实不可失败"与"可能失败"的调用点。
- "确实不可失败"的调用添加注释说明不变量,保留
expect并补充#[allow(clippy::expect_used)]。 - "可能失败"的调用改为
match/if let/?传播,或转换为结构化诊断错误。 - 生产代码
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 周)
目标:澄清"活跃失败记录"统计口径,区分历史已修复条目与当前已知失败。
执行步骤:
- 统一
scripts/engineering_health的统计口径:仅统计标记为KNOWN_FAILURE/KNOWN_DIVERGENCE/KNOWN_LIMITATION的条目。 - 在
KR_FAILURES.md顶部明确说明:当前 0 个活跃已知失败,文件主体为历史修复记录。 - 修正
CPP_FAILURES.md中"60 个 E2E 实际用例"的笔误,统一为 61 个。 - 检查其他
*_FAILURES.md是否也存在类似口径不一致,统一修正。 - 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 口径改写):
- 对齐本地与 CI 的测试 / lint 命令 ✅:
- 原入口
scripts/build_flutter.py --test已随前端切割删除;现行本地与 CI 统一命令为cargo test --workspace --all-features与cargo clippy --workspace --all-targets --all-features -- -D warnings(ci.yml的rustjob 已如此执行)。
- 原入口
- Flutter generator 问题根治 ✅ 已随前端切割消解:
scripts/patch_flutter_windows_generator.py与相关 patch 需求随 Flutter 构建整体迁出(标签before-frontend-split)。 - Android job 增加基础测试 ✅ 已随前端切割消解:
ci.yml已无 android / ios / flutter job,CI 收缩为纯后端rustjob。 - 依赖版本锁定 ✅:
serde/serde_json/libm已做小版本锁定(现行写法为~1.0.228/~1.0.149/~0.2.16)。 - 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 未完全落地的性能优化。
执行步骤:
- 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),本仓无对应验收对象。
- ✅
- 统一模式差分编码落地(已完成,后端侧仍有效):
- ✅ 变量级差分(
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)。 - 🚧 大对象(符号表、变量历史)分页或懒加载待进一步评估(后端侧)。
- ✅ 变量级差分(
- 性能基线(后端已实测;前端项已随切割迁出):
- ✅ 完成后端统一模式 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/作为历史记录)。
- ✅ 完成后端统一模式 10 万步基准实测:新增
验收标准(改写后):
- ✅
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,持续推进)
目标:在工程加固基础上,扩展教学内容与真实场景覆盖。
执行步骤:
- LeetCode 逐步填充:在 0~30 道中等题目标达成后,继续 all in 混合难度题目。✅ 2026-06-18 新增 15 道混合难度题(含 5 道困难题),当时 LeetCode 用例总数 92 道,均通过 Shadow Verification(截至 2026-09-11:
native/tests/cases/leetcode/共 138 道,全绿)。 - 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 接口的变体用例,但不强求覆盖。
- ✅ 第 7 章 7 个用例(kr_7_1~kr_7_7)已纳入,当时 K&R 防线扩展至 76/76 全绿(截至 2026-09-11:
- 学生常见错误用例库扩展:基于
docs/current/04-标准库与防线/学生错误用例集.md持续补充。 - 诊断知识卡片扩展:针对 C++ 常见错误(内存泄漏、悬垂引用、对象切片、浅拷贝双重释放、引用绑定临时对象)新增知识卡片。
本次推进记录(2026-06-18):
- 第一批新增 5 道 LeetCode 中等题源码与 golden:
lc_3Longest Substring Without Repeating Characterslc_33Search in Rotated Sorted Arraylc_48Rotate Imagelc_62Unique Pathslc_64Minimum Path Sum
- 第二批新增 5 道 LeetCode 中等题源码与 golden:
lc_2Add Two Numberslc_11Container With Most Waterlc_19Remove Nth Node From End of Listlc_31Next Permutationlc_34Find First and Last Position of Element in Sorted Array
- 第三批新增 5 道 LeetCode 中等题源码与 golden:
lc_153Sumlc_39Combination Sumlc_46Permutationslc_75Sort Colorslc_198House Robber
- 第四批新增 5 道 LeetCode 中等题源码与 golden:
lc_55Jump Gamelc_142Linked List Cycle IIlc_152Maximum Product Subarraylc_200Number of Islandslc_221Maximal Square
- 第五批新增 5 道 LeetCode 中等题源码与 golden:
lc_49Group Anagramslc_56Merge Intervalslc_78Subsetslc_102Binary Tree Level Order Traversallc_139Word Break
- 第六批新增 5 道 LeetCode 中等题源码与 golden:
lc_153Find Minimum in Rotated Sorted Arraylc_162Find Peak Elementlc_300Longest Increasing Subsequencelc_394Decode Stringlc_560Subarray Sum Equals K
- 第七批新增 15 道 LeetCode 混合难度题源码与 golden(7 困难 / 7 中等 / 1 简单):
lc_4Median of Two Sorted Arrays(困难;实现中发现 Vitro 函数返回double值异常,已改用整数返回值通过)lc_23Merge k Sorted Lists(困难)lc_25Reverse Nodes in k-Group(困难)lc_42Trapping Rain Water(困难)lc_45Jump Game II(中等)lc_53Maximum Subarray(简单)lc_73Set Matrix Zeroes(中等)lc_76Minimum Window Substring(困难)lc_84Largest Rectangle in Histogram(困难)lc_91Decode Ways(中等)lc_98Validate Binary Search Tree(中等)lc_124Binary Tree Maximum Path Sum(困难)lc_146LRU Cache(中等)lc_207Course Schedule(中等)lc_322Coin Change(中等)
- 修复发现的问题:JIT 统计信息原通过
output_lines混入用户 stdout,导致lc_3在 Shadow Verification 中出现 output_gap。已移除该输出并新增vitro_get_jit_statsC 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_163Sum Closestlc_17Letter Combinations of a Phone Numberlc_22Generate Parentheseslc_24Swap Nodes in Pairslc_29Divide Two Integerslc_38Count and Saylc_40Combination Sum IIlc_50Pow(x, n)lc_54Spiral Matrixlc_168Excel Sheet Column Titlelc_242Valid Anagramlc_509Fibonacci Numberlc_704Binary Searchlc_746Min Cost Climbing Stairslc_977Squares of a Sorted Array
- K&R 防线补充 5 个变体/基础用例:
kr_1_helloHello Worldkr_2_celsius摄氏度转华氏度kr_4_atoi自定义 atoikr_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_resetunique_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_7Reverse Integerlc_83Remove Duplicates from Sorted Listlc_190Reverse Bitslc_191Number of 1 Bitslc_202Happy Numberlc_205Isomorphic Stringslc_231Power of Twolc_263Ugly Numberlc_292Nim Gamelc_389Find the Difference
lc_412Fizz 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_67Add Binarylc_219Contains Duplicate IIlc_345Reverse Vowels of a Stringlc_349Intersection of Two Arrayslc_367Valid Perfect Squarelc_383Ransom Notelc_392Is Subsequencelc_401Binary Watchlc_409Longest Palindromelc_415Add 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 | ✅ 已修复 |
执行步骤:
- 对每个限制项建立最小复现用例,确认根因范围(Lexer/Parser/TypeChecker/BytecodeGen/VM)。
- 评估修复成本与教学价值,优先处理 P1 行为差异(影响 Shadow Verification 用例覆盖与真实代码迁移)。
- 修复后补充回归用例,更新
AGENTS.md与CHANGELOG.md [Unreleased]。 - 对暂无法修复的限制项,在
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 生成运行时边界检查;新增TrapBoundsVlaopcode(值为 129),索引前将 VLA 维度表达式求值并压栈;vitro_vm::core::executor::debug.rs在 VM 运行时将索引与运行时边界比较,越界时触发教学诊断;新增baseline/vla_bounds.c回归用例。参数退化为指针的 VLA 形参仍无法在调用点获知边界,保持跳过。 - H10
fclose后 VFSFILE*被误报为内存泄漏(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 质量保证
每项任务必须通过以下验证:
cd native && cargo test --workspace --all-features全绿。cargo clippy --all-targets -- -D warnings全绿。cargo fmt --check通过。- C/C++ Shadow Verification 无新增失败。
- 出口 3 协议冒烟:
go run ./scripts/serve_smoke通过(CI 已执行)。 - 出口 2 构建:
cargo build --target wasm32-unknown-unknown --release通过(Phase 2a 起进 CI)。 - CI 全量 workflow 通过。
8.5 风险与回退策略
| 风险 | 回退策略 |
|---|---|
| Workspace 拆分导致编译失败 | 小步迁移,每次只迁一个 crate;失败时回滚该 crate |
风险已消失(2026-09-11 FRB 移除);unified/diagnostics/engine 的拆分可重新评估(尚未执行;Rust 区冻结后不再执行,等价结构已由 MoonBit 侧 L0–L9 包切分重建),新风险为 Session 上帝对象耦合 —— 先抽 vitro_session 再迁移 |
|
| unwrap 收敛引发大量错误路径变更 | 先 warn 后 deny,分阶段提升;必要时使用 #[allow] 并附注释。注意 D14:生产代码 unwrap/expect 已回升至 3 处,需重新收敛 |
已随前端切割消解(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,不重排)。