# 5-16 Editor Group 与 Resource Tab 安全收口 Checklist v1

> 状态：done
>
> 归档说明（2026-05-21）：本文件核心安全收口已完成；正式 tab state 与错误占位剩余项已由 `5-18` 覆盖并归档。
>
> 日期：2026-05-20
>
> Owner：`mnote-web` 主编辑区 runtime / resource tab

## 1. 目标

把当前浏览器内存版 resource tab 收口为轻量 editor group 模型的第一阶段：不引入完整 VSCode 多 group，不改变 Page Aggregate 事实源，只解决打开、激活、关闭和脏资源防护的最小闭环。

## 2. 允许修改范围

- `rust/crates/mnote-web/src/routes/web_shell.rs`
- `rust/crates/mnote-web/src/ssr/pages/document.rs`
- `rust/crates/mnote-web/src/ssr/styles.rs`
- `scripts/task457-main-editor-resource-tab-smoke.js`
- 可新增一个聚焦 smoke，例如 `scripts/task460-resource-tab-close-dirty-smoke.js`

## 3. Checklist

- [x] 定义轻量 `MainEditorTabEntry` / `mainEditorTabRegistry` 语义，至少包含 `id`、`kind`、`title`、`dirty`、`saving`、`hasExternalConflict`、`lastActiveAt`。（由 `5-18` 的主 tab state 收口覆盖）
- [x] 保持 page tab 为固定 tab，但 resource tab 激活/关闭应走同一套 registry 状态更新。
- [x] `closeResourceTab` 关闭前检查 resource session：
  - [x] `saving=true` 时禁止直接关闭或等待保存完成。
  - [x] `hasExternalConflict=true` 时禁止静默关闭。
  - [x] `dirty=true` 时触发保存或确认流程；不得直接释放 session。
- [x] 关闭 active resource tab 后按 MRU 回到上一个 resource tab；没有可用 resource tab 时才回到 page tab。
- [x] resource tab 激活时更新稳定 `aria-selected`、`tabindex` 和 panel hidden 状态。
- [x] 打开失败时保留 error placeholder tab，允许用户关闭或重试，不要留下半注册状态。（由 `5-18` 覆盖）

## 4. 验收

- [x] 打开两个 resource tab，切到第二个并关闭后，应回到第一个，而不是无条件回 page tab。
- [x] 编辑 resource markdown 后立即点关闭，不应静默丢弃未保存内容。
- [x] 保存中关闭不会释放 editor session。
- [x] 打开失败的 resource tab 有明确错误占位，并可关闭。（由 `5-18` 覆盖）
- [x] 现有 `task457-main-editor-resource-tab-smoke.js` 继续通过。
- [x] 新增 close dirty / MRU smoke 通过。

## 4.1 本轮执行记录

- 已合入：resource tab MRU、关闭 guard、`aria-selected` / `tabindex` 同步、关闭后回退到上一个 resource tab。
- 已新增：`scripts/task460-resource-tab-close-dirty-smoke.js` 覆盖近期本地输入后的关闭阻止。
- 后续覆盖：正式 `MainEditorTabEntry` 模型与打开失败 placeholder tab 已由 `5-18` 收口。

## 5. 非目标

- 不实现完整 VSCode preview / pinned / sticky / drag reorder。
- 不实现 tab 持久化恢复。
- 不改变 secondary pane 布局。
- 不把 `resourceTabRegistry` 移到后端持久状态。
