# 7-58 Mindmap P2 apply_ops 与真实 UI smoke 缺口

## 状态

- 状态：done
- Owner：07-ai / mindmap resource skill / Page AI target runtime
- 发现时间：2026-06-01

## 现象

Mindmap skill 和资源 target 已有最小闭环：`fetch`、`create_from_outline`、`apply_ops` 基础工具、`mnote-mindmap` skill 注册、`task503` 和 `task525` smoke 已覆盖 API/target 绑定。但 P2 第二批仍缺 apply_ops 操作白名单文档化、长文本节点策略和真实 UI 交互 smoke。

## 证据

- `rust/crates/mnote-web/src/hermes_tools/resource.rs` 已有 mindmap `fetch/apply_ops/create_from_outline` 入口。
- `scripts/task503-mindmap-skill-capability-smoke.js` 覆盖 skill、create_from_outline、fetch、embed。
- `scripts/task525-page-ai-mindmap-resource-target-smoke.js` 覆盖 mindmap resource tab / Page AI targetPackage。
- 当前缺口未在独立 bugs/process 中跟踪；历史相关 bug `7-48/7-51/7-52` 已作为各自窄问题归档。

## 影响

- agent 可以调用 mindmap 工具，但不清楚 `apply_ops` 的稳定操作白名单和限制。
- 长文本节点可能破坏 mindmap 渲染或 agent 输出可读性。
- 现有 smoke 偏 API/target 合同，未覆盖用户真实 UI 交互，例如节点编辑、拖拽、导出等。

## 下一步

1. 已文档化 `apply_ops` 支持的操作白名单、payload schema、dry-run/revision 规则和失败形态。
2. 已为关键 ops 增加 Rust 单测，覆盖成功、别名、delete、dry-run、revision mismatch、越权/只读拒绝、unsupported op、invalid ops payload、禁止删除 root。
3. 已在 skill prompt 中明确长文本节点压缩策略：短语化、避免长段落，拆成 child nodes。
4. 已用真实 mindmap UI smoke 覆盖打开、插入、渲染、样式抽屉默认状态、slash 菜单层级和 resize 基础交互。

## 验收

- [x] `apply_ops` 白名单与限制写入 design / skill。
- [x] `hermes_tools_mindmap_apply_ops_*` targeted tests 覆盖核心操作。
- [x] 长文本节点策略有测试或明确降级说明。
- [x] 至少一条真实 mindmap UI browser smoke 通过并登记到 `scripts/TESTING_REFERENCE.md`。

## 2026-06-01 修复记录

- `skills/mnote-mindmap/SKILL.md` 已新增 `Current apply_ops contract`，明确支持 `updateText/updateNode`、`insertChild/addChild`、`deleteNode`，记录 `nodeId/id`、`text/title`、`parentId/nodeId` 等 payload schema、未知 op 拒绝、禁止删除 root、长文本短语化/拆子节点、`dryRun` 与 revision checks。
- `rust/crates/mnote-web/src/routes/hermes_tools.rs` 已补齐 apply_ops targeted tests：
  - `hermes_tools_mindmap_apply_ops_accepts_common_aliases`
  - `hermes_tools_mindmap_apply_ops_deletes_child_node`
  - `hermes_tools_mindmap_apply_ops_dry_run_returns_diff_without_writing`
  - `hermes_tools_mindmap_apply_ops_rejects_invalid_ops_payload`
  - `hermes_tools_mindmap_apply_ops_rejects_root_delete`
  - `hermes_tools_mindmap_apply_ops_rejects_unsupported_op`
- 已通过：
  - `cargo test --manifest-path rust/Cargo.toml -p mnote-web hermes_tools_mindmap_apply_ops -- --test-threads=1`
  - `node --check scripts/task455-local-folder-mindmap-clean-smoke.js`
  - `MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3303 node scripts/task455-local-folder-mindmap-clean-smoke.js`

真实 UI smoke 结果：

- `tmp/task455-local-folder-mindmap-clean-smoke/result.json`
