51 lines
2.7 KiB
Markdown
51 lines
2.7 KiB
Markdown
# 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](/mnt/Data1T/mnote/rust/crates/mnote-web/src/hermes_tools/block.rs:385) 定义 `doc_apply_block_ops`。
|
||
|
|
- [block.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/hermes_tools/block.rs:390) 仅调用 `ensure_write_contract`。
|
||
|
|
- [block.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/hermes_tools/block.rs:774) 存在 `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](/mnt/Data1T/mnote/rust/crates/mnote-web/src/hermes_tools/block.rs:413) `doc_apply_block_ops` 真实写入前调用 `ensure_page_write_preconditions`,要求 `revision` 与 `conflictDetectionKey`。
|
||
|
|
- [block.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/hermes_tools/block.rs:439) replace / delete / move 目标块现在校验 operation 内的 `blockRevisionRef`。
|
||
|
|
- [block.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/hermes_tools/block.rs:472) insert_after / move_after anchor 现在校验 operation 内的 `anchorRevisionRef`。
|
||
|
|
- [doc.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/hermes_tools/doc.rs:875) `mnote.doc.markdown_edit` 在线转调 `doc_apply_block_ops` 时自动携带当前 aggregate 的 `revision`、`conflictDetectionKey` 与每个 replace op 的 `blockRevisionRef`。
|
||
|
|
- [hermes_tools.rs](/mnt/Data1T/mnote/rust/crates/mnote-web/src/routes/hermes_tools.rs:1490) 增加批量入口负向测试,覆盖缺少 page precondition 与缺少 block revision ref。
|
||
|
|
|
||
|
|
## 6. 验证
|
||
|
|
|
||
|
|
```bash
|
||
|
|
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 相关测试通过。
|