# 1-11 [done] Batch D P1 小尾项执行 checklist v1

> 创建时间：2026-05-21
>
> 当前状态：`DONE`
>
> 目标：把 P1 阶段剩余的两个最小尾项拆成可独立执行的小批次，避免继续在大而散的 process 文档中发散：
> 1. 资源打开 resolver 收敛
> 2. 本地 Markdown 页面标题优先级收口
>
> 上位依据：
> - `/mnt/Data1T/mnote/design/01-tree-first-graph-kernel/process/1-8-mvp-post-process-execution-order-v1.md`
> - `/mnt/Data1T/mnote/design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md`
> - `/mnt/Data1T/mnote/design/03-rust-web/process/3-13-rust-web-local-markdown-gfm-ast-parser-migration-v1.md`
> - `/mnt/Data1T/mnote/design/01-tree-first-graph-kernel/done/1-6-next-phase-gap-closure-checklist-v1.md`

---

## 1. 执行顺序

先跑资源打开收敛，再跑 Markdown 标题优先级。

- 资源打开收敛影响面更窄，且可通过现有 smoke 快速确认。
- Markdown 标题优先级属于读侧口径收口，改动点更集中，但会影响 page tree / aggregate 的标题展示，因此单独成批。

不要把这两个尾项和 open editors、filetree action、BufferStore conflict UI、AI 主线混在同一轮 worker 中。

---

## 2. Batch D1：资源打开 resolver 收敛

### 2.1 目标

继续对照 Sidex editor input resolver，把正文附件、FileTree asset、new-window、active-tab 的资源打开策略收敛到更一致的 helper 和断言。

### 2.2 允许修改范围

- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
- `scripts/task463-onlyoffice-resolver-smoke.js`
- `design/05-editor-mainline/process/5-26-resource-open-resolver-convergence-checklist-v1.md`

### 2.3 禁止事项

- 不修改 `rust/crates/mnote-web/src/routes/web_shell.rs`
- 不修改 `rust/crates/mnote-web/src/routes/onlyoffice.rs`
- 不修改 ACP / Hermes 相关文件
- 不破坏文件树 edit-mode active tab 已验证行为
- 不把 `md/text/code` 改成 OnlyOffice 默认打开

### 2.4 Checklist

- [ ] 审查 `buildLocalOnlyOfficeOpenUrl`、`openEditorAttachmentEditTab`、`openConvexAssetFromFileTree` 与正文附件 open path 的重复判断。
- [ ] 提炼最小 helper，优先减少正文附件与 FileTree 的分歧。
- [ ] 保持正文附件 `弹窗编辑` 进入 main resource tab。
- [ ] 保持正文附件 `新窗口编辑` 进入浏览器新窗口。
- [ ] 保持 `md/text/code` 继续走 tiptap / 内建编辑器。
- [ ] 更新或补充 smoke 断言，覆盖正文附件编辑模式分流。

### 2.5 验收

- `cargo test -p mnote-web sidebar_tree_runtime_opens_office_assets_through_resource_shell -- --test-threads=1`
- `node scripts/task463-onlyoffice-resolver-smoke.js`

### 2.6 完成条件

这一批完成后，可以把 `5-26` 中对应重复判断项打勾，并保留剩余未完成项在原文。

---

## 3. Batch D2：Markdown 标题优先级收口

### 3.1 目标

把本地 Markdown 页面标题口径收口为：

> frontmatter title > 第一条 H1 > 文件名

当前 `parse_markdown_page` 仍只按文件名生成标题，需要补齐前两级优先级，但不能破坏 `mnote_id / path-id` 相关行为。

### 3.2 允许修改范围

- `rust/crates/mnote-web/src/routes/local_markdown_parser.rs`
- `rust/crates/mnote-web/src/routes/local_folder_source.rs`

### 3.3 禁止事项

- 不改 resource lifecycle / trash / open resolver 行为
- 不改 Page Aggregate 的 identity 规则
- 不引入新的大解析层或额外 adapter
- 不把标题优先级改回前端补丁

### 3.4 Checklist

- [ ] 为 `parse_markdown_page` 增加 frontmatter title 优先级。
- [ ] 若 frontmatter 没有 title，则回退到正文第一条 H1。
- [ ] 若都没有，再回退到文件名 stem。
- [ ] 保持 page_id / document_id / path-id 规则不变。
- [ ] 更新现有标题相关测试，避免继续断言“标题只取文件名”。
- [ ] 补一个最小回归测试，覆盖 frontmatter / H1 / 文件名三层优先级。

### 3.5 验收

- `cargo test -p mnote-web local_markdown -- --test-threads=1`

### 3.6 完成条件

这一批完成后，可以把 `3-13` 中标题相关尾项打勾，并继续保留其余 GFM AST 迁移尾项为 `process`。

---

## 4. 本轮执行记录

- 2026-05-21：已将 P1 剩余尾项拆为 `Batch D1`（资源打开 resolver 收敛）与 `Batch D2`（Markdown 标题优先级收口）。
- 2026-05-21：这两个批次都保持最小 scope，不与 open editors、BufferStore conflict UI、AI 主线混跑。
- 2026-05-21：两项都已完成并经 Rust 单测、task474 / task463 浏览器 smoke 与 CodeGraph 同步复核，现归档到 `done/`。
