归档本轮 P0/P1 bug 修复、设计审查迁移、AI selection scope 收口与 stream contract 调整,并保留当前 05 主线迁移起点。
2.1 KiB
2.1 KiB
7-21 [done][bug] mnote.doc.markdown_edit 本地文件写入绕过 dryRun / idempotency v1
发现时间:2026-05-17
状态:
[done]关联主线:
07-ai
1. 问题定义
mnote.doc.markdown_edit 的本地文件分支没有调用统一写入合同校验,也没有检查 dryRun 与 idempotencyKey,在匹配成功后直接 fs::write。
2. 证据
- doc.rs 进入
doc_markdown_edit后没有先调用ensure_write_contract。 - doc.rs 注释说明本地文件直接写回。
- doc.rs 对本地路径执行
fs::write。
3. 影响
dryRun=true时也可能落盘,违反工具预览语义。- 缺少幂等键会让重试请求重复写入,尤其是 ACP / Hermes 断线重试场景。
- 本地
.md与在线 Convex 文档的写入安全级别不一致。
4. 建议修复
- 在
doc_markdown_edit写入前统一调用ensure_write_contract。 - 对
dryRun=true返回 diff / preview,不落盘。 - 增加本地
.mddryRun 单测,断言文件内容不变。
5. 修复
已修复:
- block.rs 将统一写入合同校验开放为
pub(crate),供mnote.doc.markdown_edit复用。 - doc.rs
mnote.doc.markdown_edit入口统一调用ensure_write_contract,本地.md与在线文档一致要求idempotencyKey与显式dryRun。 - doc.rs 本地文件
dryRun=true时只返回written=false预览结果,不再写入磁盘。 - hermes_tools.rs 增加路由级回归测试,覆盖缺少
idempotencyKey与本地 dry-run 不落盘。
6. 验证
cargo test --manifest-path rust/Cargo.toml -p mnote-web hermes_tools_markdown_edit_local -- --nocapture
结果:2 个测试通过。