Files
mnote/design/old/08-legacy-rust-kernel/process/rust-kernel-missing-targets.md
T

15 KiB
Raw Blame History

[recycle] mnote Rust 内核替换剩余目标清单

更新时间:2026-04-15

关联文档:

  • /mnt/Data1T/mnote/design/old/08-legacy-rust-kernel/process/rust-kernel-backport-plan.md
  • /mnt/Data1T/mnote/design/old/08-legacy-rust-kernel/process/rust-kernel-backport-phase-checklist.md
  • /mnt/Data1T/mnote/ARCHITECTURE.md

1. 本文目的

本文不再回答“Rust 内容是否已经回迁到主仓”,而是直接回答:

距离“用 Rust 内核替换原有内核,并让绝大部分功能 CLI 化、可供 AI 自主编辑”这一最终目标,我们现在还差什么。

当前结论很明确:

  • 单仓收口已经基本完成
  • Rust workspace 与 P0 crate 已经落位
  • 部分前端 API 已经接入 Rust 风格协议与 bridge 接缝
  • 但“Rust 真正成为唯一执行内核”这件事还没有完成

也就是说,当前更接近:

“前端/Node 先学会说 Rust 协议”

而不是:

“产品已经由 Rust 内核统一执行”


2. 当前已经完成的基础

截至目前,已经完成的只是替换前的基础设施准备:

  • /mnt/Data1T/mnote/rust/ 已成为主仓内唯一 Rust workspace 根。
  • core-domaincore-protocolevent-logstorage-convex-bridgeindex-fts 已落位。
  • rust/design/core/01~04 核心设计文档已落位。
  • 文档内容、标题、统计、Sidebar 等链路,已经开始使用统一 envelope、request_idtrace_ididempotency_key 等 bridge 元信息。
  • command_logsdomain_events 已有首批落账能力。

这些工作解决的是:

  • 单仓问题
  • 协议问题
  • 目录问题
  • 第一批接缝问题

它们还没有解决“原内核是否已经被 Rust 取代”的问题。


3. 还差的核心目标

3.1 还没有形成“Rust 唯一执行内核”

这是当前最大的缺口。

虽然已有一部分 route 在构造 Rust 风格 request,但真实执行主链仍然大量停留在 Next.js route + TypeScript + Convex client

当前仍明显属于旧执行面的代表链路包括:

  • /mnt/Data1T/mnote/wolai-frontend/src/app/api/documents/create/route.ts
  • /mnt/Data1T/mnote/wolai-frontend/src/app/api/documents/delete/route.ts
  • /mnt/Data1T/mnote/wolai-frontend/src/app/api/documents/move/route.ts
  • /mnt/Data1T/mnote/wolai-frontend/src/app/api/documents/restore/route.ts
  • /mnt/Data1T/mnote/wolai-frontend/src/app/api/documents/duplicate/route.ts
  • /mnt/Data1T/mnote/wolai-frontend/src/app/api/search/documents/route.ts
  • /mnt/Data1T/mnote/wolai-frontend/src/app/api/mindmap/[docId]/route.ts
  • /mnt/Data1T/mnote/wolai-frontend/src/app/api/onlyoffice/*.ts
  • /mnt/Data1T/mnote/wolai-frontend/src/app/api/media/*.ts
  • /mnt/Data1T/mnote/wolai-frontend/src/app/api/tables/*.ts

这说明目前还没有做到:

  • 所有核心读写先进入 Rust Command / Query / Tool
  • 所有执行规则由 Rust 决定
  • Node/Next 只做 transport、auth、session、streaming、UI 适配

最终目标需要变成:

  • Web route 只负责接请求、鉴权、转发、回流结果
  • Rust 负责真正的命令执行、查询聚合、约束校验、冲突处理、日志和事件生成

验收标准:

  • 文档、块、Sidebar、搜索、页面树、Mindmap、OnlyOffice、媒体、表格等主链路都有 Rust 执行入口
  • 前端 route 不再手写业务规则和数据聚合
  • TypeScript 侧不再直接成为业务真内核

3.2 还没有完成“全域能力模型”的 Rust 化

当前 Rust workspace 只有 P0 通用内核 crate,缺的不是“再多几个通用 crate”,而是产品能力域本身还没被吸进 Rust。

还没有真正完成 Rust 化的能力域至少包括:

  • 页面树与层级操作
  • 页面创建、移动、复制、删除、恢复、清空回收站
  • BlockNote block 级操作全量协议
  • 搜索与召回
  • 引用、反链、嵌入
  • 媒体与附件
  • 在线表格
  • Mindmap
  • OnlyOffice 会话、签名、回调、强制保存
  • AI 调用的写入工具面

当前 core-domaincore-protocol 更像底层骨架,但还没长成完整产品内核。

验收标准:

  • 每个产品域都有明确 Rust domain model、command、query、tool contract
  • 前端不再自行定义第二套 payload 形状
  • “页面系统”和“对象系统”不再由不同 TS route 各自发明规则

3.3 CLI 入口还没有建立起来

你的目标里有一条是关键约束:

绝大部分功能 CLI 化

这件事当前还远未完成。

直接证据是:

  • mnote-cli 已并入主仓 workspace,但当前还只是最小命令面与 --json 计划输出协议
  • /mnt/Data1T/mnote/rust/scripts/ 还未初始化
  • /mnt/Data1T/mnote/rust/bridge/ 已初始化最小说明目录,且 crates/bridge-runtime 已提供 Phase 1 最小真实执行样板
  • /mnt/Data1T/mnote/rust/tests//mnt/Data1T/mnote/rust/fixtures/ 还未形成 CLI 驱动的验收体系

这意味着目前仍然缺少:

  • 真正可执行而不止输出计划的统一 CLI 二进制入口
  • 可脚本化的命令集
  • 稳定的 stdout/stderr/json 输出协议
  • 面向 AI 的非交互调用模式
  • dry-run / plan / apply / rollback 风格能力

最终至少应该具备的 CLI 面包括:

  • page create/get/update/move/delete/restore/list
  • block insert/replace/move/delete/get
  • search query
  • sidebar dataset
  • mindmap get/put/op
  • onlyoffice sign/callback/forcesave/session
  • media upload/list/get/delete
  • table create/get/update
  • tool run <tool-name> --json

验收标准:

  • 核心功能可以不经过浏览器完成
  • 核心功能可以稳定返回 JSON
  • shell、脚本、AI agent 都能直接调用
  • CLI 和 Web 不再各维护一套业务实现

3.4 AI 还没有真正建立在 Rust 工具面之上

当前已经有 AI 入口:

  • /mnt/Data1T/mnote/wolai-frontend/src/app/api/ai-agent/run/route.ts
  • /mnt/Data1T/mnote/wolai-frontend/src/components/editor/DocumentAiAgentPanel.tsx

但这套 AI 执行仍主要建立在前端/Node 工具注册表与页面侧 bridge 上,不是建立在 Rust 原生 tool protocol 上。

这会带来四个问题:

  • AI 能调用的工具面和 Web 内部实现强耦合
  • AI 与 CLI 不是同一执行平面
  • AI 写入行为缺少统一事务语义
  • AI 很难获得稳定、可审计、可回放的编辑能力

为了实现“AI 可自行编辑”,至少还差以下目标:

  • Rust 提供稳定的 Tool 执行协议,而不是只提供 Command/Query
  • AI 调用和 CLI 调用共享同一工具注册面
  • 每个写入工具都支持明确的目标对象、权限校验、冲突返回、审计日志
  • 支持 validate_onlydry_runexplain_plan 之类的安全模式
  • 支持机器可消费的错误码,而不是前端文案式错误

最终目标不是“AI 像用户点按钮一样绕进前端”,而是:

AI 直接调用 Rust 工具内核完成读写,Web 只是展示层。

验收标准:

  • AI agent 使用的写入工具与 CLI 使用的工具完全同源
  • AI 的每次编辑都能追踪到 command、event、trace、目标对象和 actor
  • AI 可稳定执行页面编辑、块编辑、检索、结构化改写、批处理操作

3.5 观测、审计、幂等和失败恢复还只完成了首批链路

现在已有 command_logsdomain_events,但仍是首批写链路覆盖,不是全域治理。

仍缺的能力包括:

  • 所有命令统一落账
  • 所有失败态统一编码
  • 统一重试与幂等语义
  • 统一冲突模型
  • 统一补偿与回放
  • 统一事件重建和索引重放

如果没有这一层,CLI 和 AI 即使能写,也不够稳定。

验收标准:

  • 任一写操作都能查 request、trace、command、domain event
  • 幂等 key 在 CLI、AI、Web 三侧语义一致
  • 冲突、拒绝、权限不足、对象不存在等错误有统一 code
  • 可从事件或命令日志重建关键派生层

2026-04-15 进展补记:

  • rust/crates/core-protocolbridge-runtime 已新增 bridge_request_getbridge_trace_getbridge_command_getevent_replayindex_rebuild 这组统一观测/恢复能力;当前 /api/bridge/request/api/bridge/trace 也已切到 Rust query plan + TS transport 的同一路径,不再各自直连 Convex 查询。
  • src/lib/documents/bridge-log.ts 已把命令日志与领域事件的状态语义显式化,支持 pending/succeeded/failed/rolled_backpending/committed/rejected/failed 两套状态模型,为后续冲突、失败和补偿写回提供稳定落点。

当前仍未关闭的缺口:

  • 失败态、冲突态虽然已经在页面主写链与 AI/Mindmap 写链补上第一批落账,但仍未覆盖所有对象域写链。
  • event_replay / index_rebuild 目前已成为正式命令面,但还主要停留在 runtime/工具层,尚未形成完整的持久化游标、任务调度和断点续跑体系。
  • workspace 级总览、分页、按对象范围筛选等观测 UI 仍未完善。

3.6 搜索、索引和派生视图仍在持续切换中

2026-04-15 进展补记:

  • search.documents 已不再把核心 ranking / snippet / filter 留在 TS route。当前 /mnt/Data1T/mnote/wolai-frontend/src/app/api/search/documents/route.ts 只保留参数校验、原始数据装载与 HTTP 回传;标题/正文/思维导图/表格/附件的匹配合并、高亮 snippet 与 OCR 待补队列决策已进入 rust/crates/index-fts/src/lib.rs
  • search.recent 已补齐独立 Rust query 名称,并通过 runtime 返回最近访问结果;当前保留 /api/search/recent 作为“打开页面后写最近访问记录”的 side-effect 接口,不与搜索召回混在一条写链里。
  • sidebar.dataset.list 已从“只在 route 上挂一个 Rust queryName”推进为真实 runtime query transport/api/sidebar 现会先经过 Rust runtime,再调用 sidebar:datasetList

当前仍未完全关闭的缺口:

  • 索引重建、校验与回放命令还未落到产品主路径。
  • src/app/(app)/layout.tsx 的 SSR 侧边栏初始数据仍复用现有 loadSidebarDataFromConvex helper,没有一并切到 runtime transport。

更新后的验收标准:

  • search_webimage_readslash_run 这类 AI 核心工具必须保持 RUST_OWNER,不能回退到 TS 真执行兜底。

  • builtins/** 中已被 Rust 替代的服务端真入口必须进入第一批 TS_LEGACY_DELETE,清单以 /mnt/Data1T/mnote/design/old/08-legacy-rust-kernel/done/rust-kernel-legacy-delete-list.md 为准。

  • 搜索结果由 Rust query / index 层给出。

  • TS 前端只做 UI 投影,不做核心排序与召回逻辑。

  • 索引可重建、可校验、可回放。

3.7 Mindmap 和 OnlyOffice 还没有进入真正的 Rust adapter 执行层

现在对这两个对象域,文档上已经明确了边界,但执行层仍主要在现有 TS/Convex 逻辑。

现状更接近:

  • 边界想清楚了
  • 前端形态保住了
  • 但 Rust adapter 还没真正接管

缺口主要包括:

  • adapter-mindmap 尚未并入主仓
  • adapter-onlyoffice 尚未并入主仓
  • Mindmap 节点操作还没有稳定的 Rust ops 协议
  • OnlyOffice 的 sign / proxy / callback / forcesave 还没统一进入 Rust 对象适配层

验收标准:

  • Mindmap 的结构操作可由 CLI 与 AI 直接调用
  • OnlyOffice 的对象能力具备统一 session/asset 边界
  • 不需要依赖前端 route 才能操作这些对象

3.8 仍缺一条“从旧内核切换到新内核”的明确割接路线

目前已有 backport plan,也有 phase checklist,但还缺一个更硬的最终割接视角:

  • 哪些旧 TS route 会被逐步下线
  • 哪些功能先双写、再单写
  • 哪些功能允许长期保留在前端侧
  • 哪些功能必须强制进入 Rust
  • 何时可以宣布“原内核不再是主执行面”

如果没有这一条,项目会长期停留在“看起来在迁移,实际上双内核并存”的状态。

验收标准:

  • 列出旧执行面的退役清单
  • 每个能力域有 cutover milestone
  • 明确宣布 Rust 成为唯一业务执行平面时的准入条件

2026-04-15 进展补记:

  • 本轮已新增 /mnt/Data1T/mnote/design/old/08-legacy-rust-kernel/done/rust-kernel-cutover-v1.md,首次把页面系统、块系统、查询聚合、AI、Mindmap、OnlyOffice、兼容接口统一盘点为 RUST_OWNER / TS_TRANSPORT_KEEP / TS_COMPAT_PENDING / TS_LEGACY_DELETE 四类状态。
  • 当前“不明确”的问题已经收口为“执行尚未完成”的问题:退役清单、阶段 gate 与最终宣布口径都已写清,但旧接口的物理删除和 AI 工具面的完全统一还未完成。

4. 对最终目标的重新拆解

如果目标是:

Rust 内核替换原有内核,绝大部分功能 CLI 化,AI 可以自行编辑

那么最终至少要同时满足下面四件事。

4.1 Rust 是唯一业务执行平面

要求:

  • Web、CLI、AI 都调用同一 Rust command/query/tool 内核
  • 前端不再是业务规则主载体

4.2 CLI 是一等公民,不是调试附属品

要求:

  • 大部分核心能力都能通过 CLI 完成
  • 输出稳定 JSON
  • 支持脚本化、批处理和非交互执行

4.3 AI 只是 CLI/Tool 的智能调度者

要求:

  • AI 不再依赖页面私有 bridge 才能编辑
  • AI 调用的每一步都可审计、可回放、可限权

4.4 Convex 继续是事实层,但不再直接暴露产品规则

要求:

  • Convex 主要承担持久化与事实保存
  • 规则、协议、工具、索引、对象适配统一收进 Rust

5. 建议按优先级补齐的剩余里程碑

按最终目标倒推,接下来最应该补的不是 UI,而是下面六个里程碑。

M1. 建立真实 Rust 执行入口

  • 初始化 rust/bridge/
  • 让 Web route 可以调用真实 Rust 运行时,而不是只在 TS 中模拟 Rust request
  • 先覆盖 documents.create/get/save/title/options/stats/sidebar/search

M2. 并入 mnote-cli

  • 在主仓加入 CLI crate
  • 先定义稳定命令面和 JSON 输出协议
  • 让页面、块、搜索、Sidebar 至少先能命令行操作

M3. 完成页面系统与块系统的 Rust 接管

  • 页面创建、移动、删除、恢复、复制
  • block 插入、替换、移动、删除
  • 页面树与回收站

M4. 完成搜索/索引/派生视图 Rust 化

  • 把搜索、snippet、排序、Sidebar 数据集聚合切到 Rust
  • 建立索引重建与校验命令

M5. 完成对象域 adapter

  • adapter-mindmap
  • adapter-onlyoffice
  • 后续再看媒体、表格等对象域

M6. 让 AI 与 CLI 共用同一 Tool 面

  • AI 不再调用前端私有写入逻辑
  • 改为直接使用 Rust tool protocol
  • 加入 dry-run、权限、审计、回放能力

6. 一句话结论

当前不是“还差一点点就完成 Rust 内核替换”,而是:

我们已经完成了 Rust 内核替换前的单仓收口、协议奠基和首批接缝,但距离“Rust 真正取代旧内核,并让 CLI 与 AI 成为一等执行入口”还差一整层执行面重构。

最关键的剩余目标只有三条:

  • 把业务执行权从 TS route 真正移交给 Rust
  • 把核心能力系统化地做成 CLI
  • 让 AI 与 CLI 共用同一套 Rust tool 内核

只要这三条没完成,就还不能说“原有内核已经被 Rust 替换”。