Files
mnote/bugs/07-ai/done/7-22-apply-block-ops-missing-write-preconditions-v1.md
lix-2026 a2cb1338c8 chore: 保存当前架构收口与 bug 修复快照
归档本轮 P0/P1 bug 修复、设计审查迁移、AI selection scope 收口与 stream contract 调整,并保留当前 05 主线迁移起点。
2026-05-18 17:01:35 +08:00

2.7 KiB

7-22 [done][bug] mnote.doc.apply_block_ops 批量写入缺少 revision / conflictDetectionKey 校验 v1

发现时间:2026-05-17

状态:[done]

关联主线:07-ai

1. 问题定义

mnote.doc.apply_block_ops 的批量入口只校验 dryRun / idempotency 写入合同,没有调用页面 revision、conflictDetectionKey、blockRevisionRef 的写前校验。

同文件中已有 ensure_page_write_preconditions,但该批量入口没有使用它。

2. 证据

  • block.rs 定义 doc_apply_block_ops
  • block.rs 仅调用 ensure_write_contract
  • block.rs 存在 ensure_page_write_preconditions,但批量入口未调用。

3. 影响

  • AI 可能基于旧 PageAggregate 对正文写入,覆盖用户新编辑。
  • 多轮 Hermes / ACP run 同时写入时缺少冲突保护。
  • markdown_edit 在线分支会转调 apply_block_ops,因此该缺陷会影响 markdown 主路径。

4. 建议修复

  • doc_apply_block_ops 真实写入前必须校验 page revision 与 conflictDetectionKey。
  • 块级操作应支持并校验 blockRevisionRef 或等价版本字段。
  • 增加负向测试:缺少 revision / conflictDetectionKey 时真实写入必须拒绝。

5. 修复

已修复:

  • block.rs doc_apply_block_ops 真实写入前调用 ensure_page_write_preconditions,要求 revisionconflictDetectionKey
  • block.rs replace / delete / move 目标块现在校验 operation 内的 blockRevisionRef
  • block.rs insert_after / move_after anchor 现在校验 operation 内的 anchorRevisionRef
  • doc.rs mnote.doc.markdown_edit 在线转调 doc_apply_block_ops 时自动携带当前 aggregate 的 revisionconflictDetectionKey 与每个 replace op 的 blockRevisionRef
  • hermes_tools.rs 增加批量入口负向测试,覆盖缺少 page precondition 与缺少 block revision ref。

6. 验证

cargo test --manifest-path rust/Cargo.toml -p mnote-web hermes_tools_apply_block_ops_requires_page_preconditions -- --nocapture
cargo test --manifest-path rust/Cargo.toml -p mnote-web hermes_tools_markdown_edit -- --nocapture

结果:批量前置条件测试通过,5 个 markdown_edit 相关测试通过。