Files
mnote/design/old/10-review/done/10-current-mnote-ai-runtime-review-v1.md
T
Agent Board b798f628ee chore: land tree view-state, vault, Pi module split, and repo hygiene
Persist PageTree expand state via control-plane view-state and align
chevron/DOM with restored expansion; keep Sidex-style shallow page-tree
scan and drop the unused recursive scanner that only added cargo noise.

Add password vault workbench routes/runtime/skill/CLI, split page_ai_pi
into a module package, and retire Hermes/ACP/OpenHub recycle + root
harness evidence from the index while gitignoring recycle and local
diag dumps.

Archive superseded design/bugs docs under old/, point architecture at
ARCHITECTURE.md, and refresh smokes for Pi S1–S7, vault, and editor
regressions so the working tree can stay clean.
2026-07-21 05:13:05 +08:00

5.8 KiB

[recycle] 10 [done] 当前 mnote 项目 AI / Page Aggregate 定向 Review v1

更新时间:2026-05-17

执行状态:done

范围:当前主线中 Page Aggregate 单一真源、页面 AI 快速编辑、mnote.doc.markdown_edit 与 ACP / Hermes runtime 的源码级定向审查。

2026-06-01 口径补充,2026-06-06 收紧:本文是 2026-05-17 的历史 review 快照。文中“mnote.doc.markdown_edit 是简单正文编辑主路径”的结论已被后续 local-first agent 文件编辑控制面覆盖;当前 local-first 普通 Markdown 编辑主路径以 AGENTS.mdARCHITECTURE.mddesign/07-ai/process/7-18-local-first-agent-file-editing-control-plane-v1.md 为准,即授权文件引用 + allowed roots/files + agent 原生 patch/diff + watcher/BufferStore/Page Aggregate 同步。mnote.doc.markdown_edit 只保留为历史 online/cloud/compat 回归和结构校验对照,不作为 local-first 新 agent run 的推荐 fallback。

1. 本轮结论

本轮没有发现 Page Aggregate 读取主链重新回退到 Next compat builder 的证据。后续修复已进一步收口:AI context 的 page subtree 只读 Rust Page Aggregate projection,不再由前端本地构造第二份 page tree 真相。

本轮识别出的 07-ai markdown 编辑 P0 风险已修复:

  • mnote.doc.markdown_edit 是简单正文编辑主路径,并被 /api/page-ai/block-edit-workflow 通过统一 mnote tool executor 调用。
  • 中文归一化匹配不再把 UTF-8 byte index 当 char index。
  • 同一块内多次 markdown_edit 会合并到最终 markdown 结果后再映射写回,避免后续 block op 覆盖前序修改。
  • 在线写回在无法安全映射最终 markdown 时明确拒绝,避免 ok=true 伪成功。
  • Hermes guidance、manifest、tool toggle、dryRun / idempotency、revision / conflictDetectionKey 与 Reasonix ACP payload 已同步到当前工具合同。

剩余长期方向仍是 Phase C review session / streaming apply;当前设计冻结,不属于本轮 bug 修复范围。

2. 发现的问题

R-01 P0:中文归一化匹配使用 byte index 当 char index

关联缺陷:

  • bugs/07-ai/done/7-16-markdown-edit-normalized-search-byte-index-v1.md

证据:

  • rust/crates/mnote-web/src/hermes_tools/doc.rs:920-936

search_replace 的 Level 2 先在 norm_line 上用 find() 得到 UTF-8 byte offset,却把这个 offset 传给 line.char_indices().nth(start) 当作字符序号使用。中文、多字节标点或中英混排时,替换范围会偏移,可能替错片段或生成错误内容。

影响:

  • 页面 AI 对中文正文的“忽略空白 / 全半角差异”替换不可靠。
  • 该问题位于 mnote.doc.markdown_edit 的基础 search/replace 层,会同时影响在线文档和本地 .md 文件。

R-02 P0:同一块内多次 markdown_edit 会被后续 block op 覆盖

关联缺陷:

  • bugs/07-ai/done/7-17-markdown-edit-same-block-multi-op-overwrite-v1.md

证据:

  • rust/crates/mnote-web/src/hermes_tools/doc.rs:779-824
  • rust/crates/mnote-web/src/hermes_tools/doc.rs:854-878
  • rust/crates/mnote-web/src/hermes_tools/doc.rs:976-1008

doc_markdown_edit 已经在 md 变量中顺序应用了所有 search/replace,但 Convex 写入时没有使用这个最终 markdown。它重新读取原始 Page Aggregate blocks,并对每个 operation 用原始 block 文本生成一个 replace block op。

如果两个 operation 命中同一个 block,第二个 block op 的 content 仍从原始文本计算,会覆盖第一个 operation 的结果。也就是说,markdown 层算出的最终结果与实际落库结果可能不一致。

影响:

  • AI 一次请求中常见的“把同一段里的 A 改成 B,同时把 C 改成 D”可能只保留最后一次修改。
  • 前端快路径仍可能显示“已通过页面 markdown 编辑快路径完成写入”,但正文只部分生效。

3. 修复状态

  • mnote.doc.markdown_edit manifest 已补齐 required / write contract。
  • 本地 .md 写入已尊重 dryRun / idempotency。
  • 在线写回已使用最终 markdown 作为真源进行映射;无法安全映射时返回明确错误。
  • mnote.doc.apply_block_ops 批量写入已补 revision / conflictDetectionKey 前置校验。
  • /api/page-ai/block-edit-workflow 已从绕过 executor 改为复用统一 Hermes mnote tool executor。
  • ACP Reasonix wrapper 已透传 actor/session/run/toolCall/trace/dryRun/idempotency/workspace/document 等上下文字段。

4. 后续边界

  1. Phase C 的 review session / streaming apply 仍冻结,当前不扩新 AI 功能。
  2. 复杂结构编辑继续走 apply_block_ops / mnote.block.*,不要把正文 search/replace 回退到结构性块工具。
  3. Page Aggregate 仍需后续推进 EditorBlockDocument 原生落库真相。

5. 本轮验证

静态检查范围:

rg -n "markdown_edit|apply_block_ops|block-edit-workflow|local_rule|page_ai_workflow|mnote\\.doc\\.fetch" rust wolai-frontend scripts design/07-ai design/10-review --glob '!rust/target/**' --glob '!node_modules/**'
rg -n "page-aggregate|pageAggregate|PageAggregate|blockDocument|projectionSource|documents/save|documents/options|/api/page-aggregate" rust/crates/mnote-web rust/crates/bridge-runtime wolai-frontend/src scripts --glob '!rust/target/**' --glob '!node_modules/**'

修复后定向验证:

cargo test --manifest-path rust/Cargo.toml -p mnote-web markdown_edit -- --nocapture
cargo test --manifest-path rust/Cargo.toml -p mnote-web page_ai_workflow -- --nocapture
cargo test --manifest-path rust/Cargo.toml -p mnote-web acp_client -- --nocapture
cargo test --manifest-path rust/Cargo.toml -p mnote-web acp_session_manager -- --nocapture
node --check scripts/reasonix-acp-wrapper.mjs
MNOTE_REASONIX_ACP_SELFTEST=1 node scripts/reasonix-acp-wrapper.mjs

结果:上述验证均通过。