# 1-0 [recycle] Tree-First Graph 内核实施清单 v1

> 更新时间：2026-04-16
>
> 关联文档：
> - `/mnt/Data1T/mnote/design/01-tree-first-graph-kernel/process/1-tree-first-graph-kernel-v1.md`
> - `/mnt/Data1T/mnote/design/03-rust-web/process/3-1-rust-web-long-term-checklist-v2.md`
> - `/mnt/Data1T/mnote/design/03-rust-web/process/3-rust-web-long-term-architecture-v1.md`
> - `/mnt/Data1T/mnote/design/06-mindmap/process/6-mindmap-kernel-phase6-projection-editor-v1.md`
> - `/mnt/Data1T/mnote/ARCHITECTURE.md`

## 1. 文档目的

这份清单是基于**新架构前提**重写的。

此前的长期清单主要站在：

- Rust Web 层
- 页面访问性能
- islands 化

这些视角来拆解任务。

现在架构前提已经变化：

> **mnote 的长期中心不再只是“Rust Web + 页面瘦身”，而是“Tree-First Graph Kernel + 多投影 + Rust 主执行面”。**

因此这份清单的目标是：

- 先定义统一结构内核要怎么落地
- 再定义 Sidebar / 页面树 / 文件树 / Mindmap / 搜索 / AI / BlockNote 如何接入这个内核
- 最后再定义 Rust Web 层与前端投影视图如何围绕内核重构

---

## 2. 先给结论

长期路线应改成下面这个顺序：

1. **先立 kernel**
2. **再让 Rust Web 承接 kernel 的 query / command / projection**
3. **再让 Sidebar、搜索、Mindmap、AI、阅读页都开始直接消费 kernel**
4. **最后才边缘化 `BlockNote` 与旧前端壳**

这意味着：

- Rust Web 仍然重要
- 页面性能重构仍然重要
- 但它们现在都不是第一原则

第一原则变成：

> **所有对象最终都要回到统一的 `tree-first graph kernel`，而不是继续各自挂在不同前端壳和对象模型上。**

---

## 3. 新的总体验收定义

只有同时满足下面几条，才能说新架构真正成立：

- [x] 已存在 Rust 主导的 kernel node / edge 真相层
- [ ] 页面树、文件树、Mindmap、RAG 结构索引、AI 结构操作都开始直接依赖 kernel，而不是各有一套真相
- [x] Rust Web 层开始作为 kernel 的主 query / command / projection 承载层
- [x] Sidebar / 搜索 / 阅读页 / Mindmap / AI 至少有一部分已变成 kernel projection
- [ ] `BlockNote` 不再定义页面结构本体，只负责某类内容节点编辑
- [ ] 旧前端壳不再承担对象真相，只承担过渡投影或兼容层

---

## 4. 重新定义阶段

新架构下，阶段顺序应改成：

- Kernel Phase 0：边界冻结与术语统一
- Kernel Phase 1：Node / Edge / Projection 基础模型落地
- Kernel Phase 2：Kernel Query / Command / Subtree / Graph Traversal 协议落地
- Kernel Phase 3：Rust Web 接入 kernel，成为主承载层
- Kernel Phase 4：Sidebar / 页面树 / 文件树切到 kernel projection
- Kernel Phase 5：结构知识刷新与 kernel-aware 检索
- Kernel Phase 6：Mindmap 降级为 projection / editor，而不是对象中心
- Kernel Phase 7：文档阅读页与 AI 面板切到 kernel projection
- Kernel Phase 8：`BlockNote` 退化为内容编辑挂件
- Kernel Phase 9：旧前端壳与旧对象模型下线

---

## 5. Kernel Phase 0：边界冻结与术语统一

**当前状态：`DONE`**

### 5.1 目标

先把“什么是 kernel，什么只是 projection”说清楚。

### 5.2 已有事实

- [x] 已有：
  - [tree-first-graph-kernel-v1.md](/mnt/Data1T/mnote/design/01-tree-first-graph-kernel/process/1-tree-first-graph-kernel-v1.md)
  - [rust-web-long-term-checklist-v2.md](/mnt/Data1T/mnote/design/03-rust-web/process/3-1-rust-web-long-term-checklist-v2.md)
- [x] 已明确：
  - `Mindmap` 不是中心
  - `BlockNote` 不是中心
  - `tree-first graph` 才是中心

### 5.3 仍需完成

- [x] 统一术语：
  - `node`
  - `edge`
  - `projection`
  - `subtree`
  - `content node`
  - `reference edge`
  - `summary node`
  - `index node`
- [x] 统一“事实源 / 投影 / 编辑器 / 外挂”的四层边界
- [x] 明确哪些现有对象暂时继续存在，哪些将来必须并入 kernel

### 5.4 完成判定

- [x] 后续文档和任务不再把“导图页”“页面树”“BlockNote 文档”当作独立事实源

### 5.5 当前落地说明

- [x] `tree-first-graph-kernel-v1.md` 已补术语冻结、四层边界与并入策略
- [x] 当前口径明确：
  - 导图页不是事实源
  - 页面树不是事实源
  - `BlockNote` 文档结构不是事实源

---

## 6. Kernel Phase 1：Node / Edge / Projection 基础模型落地

**当前状态：`DONE`**

### 6.1 目标

把设计文档中的 kernel 定义，变成真正的 Rust 类型与协议。

### 6.2 实施清单

- [x] 在 Rust core 中定义统一 `Node` 模型
- [x] 定义统一 `Edge` 模型
- [x] 定义统一 `Projection` 请求模型
- [x] 定义 node type 枚举或稳定字符串集合
- [x] 定义 edge type 枚举或稳定字符串集合
- [x] 定义 node metadata / content payload / refs payload 边界
- [x] 定义 subtree 标识方式
- [x] 定义 projection 标识方式
- [x] 定义版本、审计、trace 在 kernel 上的挂载方式

### 6.3 最小首批节点建议

- [x] `workspace`
- [x] `folder`
- [x] `page`
- [x] `section`
- [x] `asset`
- [x] `book`
- [x] `pdf`
- [x] `mindmap_node`
- [x] `summary`
- [x] `ai_note`
- [x] `reference_anchor`

### 6.4 最小首批边建议

- [x] `parent_of`
- [x] `child_of`
- [x] `contains`
- [x] `references`
- [x] `backlinks_to`
- [x] `source_of`
- [x] `summarizes`
- [x] `indexes`

### 6.5 完成判定

- [x] Rust core 中已经存在可被 Web / CLI / AI 共用的 kernel 类型定义

### 6.6 当前落地说明

- [x] `rust/crates/core-protocol/src/kernel.rs` 已进入主线
- [x] `core-protocol/src/lib.rs` 已导出 kernel 类型，供 Web / runtime 复用

---

## 7. Kernel Phase 2：Kernel Query / Command / Subtree / Graph Traversal 协议落地

**当前状态：`DONE`**

### 7.1 目标

让 kernel 不是静态类型，而是可以被查询和操作。

### 7.2 实施清单

- [x] 定义 `get_node`
- [x] 定义 `get_subtree`
- [x] 定义 `list_children`
- [x] 定义 `list_edges`
- [x] 定义 `traverse_graph`
- [x] 定义 `create_node`
- [x] 定义 `update_node`
- [x] 定义 `move_subtree`
- [x] 定义 `attach_edge`
- [x] 定义 `detach_edge`
- [x] 定义 `project_view`

### 7.3 与当前已有能力的关系

当前已有一些可复用基础：

- [x] Mindmap 的 subtree / op 思想
- [x] Rust command/query/tool envelope
- [x] CLI / AI / runtime 可共用的调用结构

但还没有：

- [x] 统一 kernel query / command 面

### 7.4 完成判定

- [x] 至少有一组 kernel 查询和写入协议进入 Rust core-protocol / bridge-runtime 主线

### 7.5 当前落地说明

- [x] `bridge-runtime` 已支持：
  - `kernel.node.get`
  - `kernel.subtree.get`
  - `kernel.children.list`
  - `kernel.edges.list`
  - `kernel.graph.traverse`
  - `kernel.project_view`
  - `kernel.node.create`
  - `kernel.node.update`
  - `kernel.subtree.move`
  - `kernel.edge.attach`
  - `kernel.edge.detach`
- [x] 当前首条真实 projection 样板已选用 Sidebar 数据集，经 Rust runtime 统一输出 kernel subtree / projection 结果

---

## 8. Kernel Phase 3：Rust Web 接入 kernel

**当前状态：`DONE`**

### 8.1 目标

让 `mnote-web` 不只是通用骨架，而是开始承接 kernel。

### 8.2 当前已有事实

- [x] `mnote-web` 骨架已存在
- [x] 已有 request context / SSE / WS / Hermes bridge skeleton

### 8.3 仍需完成

- [x] 让 `mnote-web` 开始提供 kernel query route
- [x] 让 `mnote-web` 提供 subtree / projection route
- [x] 至少切一条真实主路径，不再只是 compat bridge
- [x] 为 kernel route 增加集成验证

### 8.4 完成判定

- [x] `mnote-web` 已承接至少一条真实 kernel 主链

### 8.5 当前落地说明

- [x] `rust/crates/mnote-web/src/routes/kernel.rs` 已新增：
  - `/api/kernel/projections/sidebar`
  - `/api/kernel/subtree`
  - `/api/kernel/edges`
  - `/api/kernel/graph`
- [x] `mnote-web` 已通过路由级测试，说明 kernel projection 已经不再只是骨架声明

---

## 9. Kernel Phase 4：Sidebar / 页面树 / 文件树切到 kernel projection

**当前状态：`PARTIAL`**

### 9.1 目标

把工作区导航从“前端组件 + 自己拼树”，改成“kernel tree projection”。

### 9.2 当前真实状态

- [x] Sidebar 有服务端首包
- [x] Sidebar 有 Rust query 契约基础
- [ ] 但主 Sidebar 仍是超大客户端组件
- [ ] 页面树 / 文件树还没有真正基于 kernel node / edge

### 9.3 实施清单

- [ ] 用 kernel node/edge 重新定义 Sidebar 数据源
- [ ] 用 projection query 输出 Sidebar tree
- [ ] 用 projection query 输出 file tree
- [ ] 用 projection query 输出 page tree
- [ ] 把展开/折叠/拖拽从对象真相层剥离成局部 UI 状态
- [ ] 把主布局里的 Sidebar 继续拆轻

### 9.4 完成判定

- [x] Sidebar / 页面树 / 文件树已经开始直接消费 kernel projection

### 9.5 当前落地说明

- [x] Rust runtime 已经可以把 `sidebar.dataset.list` 转成统一 kernel projection / subtree 结果
- [ ] 当前前端主 Sidebar 还没有直接切到这个结果，仍保留 `DocumentRecord[] -> buildDocumentTree(...)` 的旧拼树逻辑

---

## 10. Kernel Phase 5：结构知识刷新与 kernel-aware 检索

**当前状态：`NOT_STARTED`**

### 10.1 目标

让系统不再依赖一个独立的传统 RAG 子系统，而是：

- 通过定时知识刷新持续生成和维护结构化知识
- 通过 kernel-aware 检索直接命中 node / subtree / evidence
- 通过 Mindmap / BookMindmap / summary node / reference edge 构成知识索引层

一句话说：

> **不是“部署一个 RAG 系统”，而是“把 kernel 本身建设成可刷新、可检索、可追溯的知识底座”。**

### 10.2 需要完成

- [ ] 定义知识刷新任务模型
- [ ] 定义 cron 驱动的定时刷新入口
- [ ] 定义增量刷新输入：workspace / book / pdf / page / subtree
- [ ] 定义知识刷新输出：
  - `summary node`
  - `ai_note node`
  - `index node`
  - `reference edge`
  - `book subtree`
  - `chapter subtree`
- [ ] 定义 kernel-aware 搜索输入
- [ ] 定义按 node type / subtree / edge 的过滤
- [ ] 让检索结果可以返回 node / subtree / evidence
- [ ] 定义“结构命中 -> 正文/附件/页码回查”的两段式检索
- [ ] 把书籍 / PDF / 章节树 / BookMindmap 纳入 kernel index
- [ ] 把 `Mindmap` / `BookMindmap` 定义成结构知识索引的一种 projection，而不是独立 RAG 页面
- [ ] 如果现有 `LightRAG` 仍有残留，明确其过渡边界与移除计划

### 10.3 当前基础

- [x] 搜索已有前端 runtime
- [x] Rust 有 FTS 与 Mindmap subtree 能力雏形
- [x] 已有 `BookRAG` / `Mindmap` / `BookMindmap` 方向上的结构索引思路
- [ ] 但还没有真正的知识刷新任务层
- [ ] 还没有 kernel-aware 检索面
- [ ] 还没有把“定时刷新知识 -> 更新 kernel 节点/边 -> 查询回查证据”串成主链

### 10.4 完成判定

- [ ] 至少有一条 cron 驱动的知识刷新链可以稳定更新 kernel 中的结构知识节点
- [ ] 至少有一条检索路径能直接返回 kernel node / subtree 命中结果
- [ ] 至少有一条命中结果能继续回查正文、附件、页码或证据节点

---

## 11. Kernel Phase 6：Mindmap 降级为 projection / editor

**当前状态：`PARTIAL`**

### 11.1 目标

让 Mindmap 从“独立对象中心 + blob 真相 + 前端重壳”退回到“kernel subtree / graph 的一种 projection / editor”。

### 11.2 当前已有事实

- [x] Rust `core-protocol` 已有：
  - `KernelNodeType::Mindmap`
  - `KernelNodeType::MindmapNode`
  - `KernelProjectionKind::Mindmap`
- [x] Rust runtime 已有：
  - `mindmap_get`
  - `mindmap_get_subtree`
  - `mindmap_put`
  - `mindmap_apply_ops`
- [x] 导图独立页已脱离 `editorStub`
- [x] 当前主线理念已明确：
  - `Mindmap` 不是中心
  - `tree-first graph kernel` 才是中心
- [x] 但当前真实主链仍然主要是：
  - `MindmapBlock.tsx` 持有重交互壳
  - `mindmaps.get/put` 读写整棵 blob
  - 前端 `buildMindmapProjection(...)` 对 blob 做摘要
  - `mindmap_apply_ops` 仍直接操作 compat mindmap 树

### 11.3 仍需完成

- [x] Phase 6 的详细口径改以：
  - `/mnt/Data1T/mnote/design/06-mindmap/process/6-mindmap-kernel-phase6-projection-editor-v1.md`
  - 为准
- [ ] 把导图事实源切到 kernel node / edge / subtree
- [ ] 把 `MindmapTreeNode` / `MindmapOp` 降级为 compat DTO，而不是长期 canonical model
- [ ] 让导图独立页读取正式 `mindmap` kernel projection，而不是继续以 `mindmaps.get` raw blob 为主
- [ ] 让文档内嵌导图读取 `mindmap_preview` / subtree preview，而不是直接拼整棵树
- [ ] 让导图编辑操作回写 kernel command，而不是继续以 `getData()/POST whole blob` 为主
- [ ] 让 `mindmap_apply_ops` 改成 compat facade，内部翻译到 kernel command
- [ ] 让 AI / CLI 可以直接创建、修改、移动 `mindmap_node` 与 reference edge
- [ ] 让 `mindmaps` 表退到 compat snapshot / import-export 层，而不是长期事实源

### 11.4 完成判定

- [ ] 导图独立页与内嵌预览都已经直接消费 kernel projection
- [ ] 常规编辑不再依赖整图 blob 覆盖保存
- [ ] AI / CLI 已能直接操作导图 kernel truth
- [ ] `simple-mind-map` 已退到 renderer / adapter 层
- [ ] `Mindmap` 可以被正式定义为 kernel 的一种 projection / editor，而不是独立事实源

---

## 12. Kernel Phase 7：文档阅读页与 AI 面板切到 kernel projection

**当前状态：`NOT_STARTED`**

### 12.1 目标

让阅读页和 AI 都不再直接围绕旧页面对象模型打转，而是围绕 kernel。

### 12.2 阅读页部分

- [ ] 阅读页改成读取 page subtree projection
- [ ] 阅读页大纲来自 kernel subtree
- [ ] 回链、引用、结构信息来自 kernel edge
- [ ] 页面阅读流作为 projection，而不是事实源

### 12.3 AI 部分

- [ ] AI tool 直接面向 node / subtree / edge
- [ ] AI 不再默认面向“页面前端壳”
- [ ] AI 能创建 summary node / ai_note node / reference edge
- [ ] AI 能把 PDF / Book 解析结果落进 kernel index

### 12.4 当前基础

- [x] 文档阅读态已出现
- [x] AI host/runtime 已拆分
- [ ] 但两者都还没开始直接面向 kernel projection

### 12.5 完成判定

- [ ] 阅读页与 AI 至少有一条主路径已经直接消费 kernel projection

---

## 13. Kernel Phase 8：BlockNote 退化为内容编辑挂件

**当前状态：`NOT_STARTED`**

### 13.1 目标

把 `BlockNote` 从“页面定义者”改成“某类内容节点编辑器”。

### 13.2 当前已有事实

- [x] 文档页默认已不再直接强挂 `BlockNote`

### 13.3 仍需完成

- [ ] 定义 page subtree 与 content node 的关系
- [ ] 定义哪些节点仍由 `BlockNote` 编辑
- [ ] 定义哪些结构节点改由 kernel-aware editor 操作
- [ ] 把页面结构与 `BlockNote` 块结构彻底分离
- [ ] 把 `DocumentContent` 里外围 panel 再次拆出去

### 13.4 完成判定

- [ ] 页面结构已经不再由 `BlockNote` 数据结构定义

---

## 14. Kernel Phase 9：旧前端壳与旧对象模型下线

**当前状态：`NOT_STARTED`**

### 14.1 目标

当 kernel + Rust Web + projection 都建立后，再下线旧对象模型和旧主壳。

### 14.2 实施清单

- [ ] 盘点哪些旧页面/route 仍直接承载对象真相
- [ ] 盘点哪些旧 helper 仍在拼装第二套对象模型
- [ ] 删除已被 kernel projection 替代的旧 route
- [ ] 删除已被 kernel command/query 替代的旧 adapter
- [ ] 更新最终架构文档与对外口径

### 14.3 完成判定

- [ ] 旧前端壳与旧对象模型都不再是主事实来源

---

## 15. 这份清单与 Rust Web v2 的关系

这份清单不是替代：

- [rust-web-long-term-checklist-v2.md](/mnt/Data1T/mnote/design/03-rust-web/process/3-1-rust-web-long-term-checklist-v2.md)

而是对它做“上位重排”。

关系应理解为：

- `rust-web-long-term-checklist-v2`
  - 关注当前代码状态下的 Web / 页面重构现实进度
- `tree-first-graph-kernel-checklist-v1`
  - 关注在新内核架构下，整体路线应该如何重新排序

一句话说：

> **Rust Web v2 告诉你“现在代码做到哪了”，这份新清单告诉你“在新架构下，接下来应该围绕什么继续做”。**

---

## 16. 最终结论

采用新架构后，长期 checklist 的中心必须变化。

不再是：

- 先 Web 重构，再考虑对象模型

而应该是：

- **先 Kernel，再 Projection，再 Web，再 Editor**

因此后续真正的主线应改成：

> **以 `tree-first graph kernel` 为事实中心，Rust Web 承接其 query/command/projection，Sidebar/搜索/Mindmap/阅读页/AI 都逐步切到 kernel projection，最后再让 `BlockNote` 与旧前端壳退场。**
