OH / OneFlow / OnePage / OH MCP 路由与操作审计(2026-10-18)¶
历史记录 / Historical record:本文保留当时的计划、研究或验收证据,不代表 0.11 当前能力全集。现行说明见 文档入口;英文入口见 English overview。
本次对四个子系统做只读审计并立即修补可确认的缺漏。审计基线 13a71c52;修复提交见文末。
一、结论¶
- 审计发现 44 项缺口(OH 23 项、OnePage/OneFlow 21 项),按 P0/P1/P2 分级。
- 已修复:OH P0 1 项、OH P1 11 项、OnePage/OneFlow P0 1 项、P1 10 项,以及大部分低成本 P2。
- 新增回归:
tools/oh-route-onepage-browser-test.mjs(24 条断言)、MCP 入方向 Rust 单测 3 条、路由资产同步 60 行。 - 全量 guard 仍只剩 8 处既有 UI 文案违规(Plugins/Courses/AttachActionsSheet/ExtHw/Notify),非本轮引入。
二、OH:路由与操作¶
已修复¶
| 问题 | 根因 | 修法 |
|---|---|---|
| OH 搜索窗/命令面板点 OH 设置行落到「插件」页 | goSearchRow 已切到 OH 入口,消费方随后又 openSettings("plugins") 覆盖 |
删掉两处后置入口覆盖;入口只由 goSearchRow 决定 |
高级档 OH 行首次进入停在基础档、ui_navigate 假成功 |
requestOhTier 请求早于组件挂载,subscribeOhTier 挂载时不取 pending |
挂载时先 takeTier() 再订阅 |
首页态 navigate learn-* 子页/详情页静默回首页 |
KNOWN_PAGES 只收一级页,openTab 对未知页回首页 |
子页/详情页并入 KNOWN_PAGES,抽出 isKnownPage 供门面共用 |
ext_tab 白名单与 openTab 白名单矛盾、today 残留 |
两处手写白名单 | 统一走 isKnownPage;today 全链路别名为 homepage |
| navigate / open_page 对失败假报成功 | nav.go 返回 void、openAtom 恒 true |
两者返回真实布尔值,Rust 按结果回话 |
| 壁纸、动态壁纸声音、玻璃程度、标签栏样式、系统取色没有检索行 | 新控件未注册 | 补 5 行 + 壁纸/声音锚点 |
| 「搜索与胶囊」分节泄漏到所有设置页签 | 页签显隐按 SectionHead 精确匹配,OneGUI Section textContent 含 hint | 显隐改最长前缀匹配;补胶囊默认动作/最近搜索记录两行 |
| 极客模式无 SectionHead、无归属、无检索行 | 区块直接挂在桌面小组件卡后 | 加 SectionHead「极客模式」+ 页签映射 + 两行检索 |
workspace_write op=collapse 实际关闭成员标签并删定义 |
调了 workspaceClose |
新增 ext.workspaceCollapse(只折叠);Rust collapse 改调它 |
ext_workspace_delete 只有 handler 没有 ToolDef |
漏注册 | 补 ToolDef(confirm:true) |
| OneFlow 步骤契约与执行器不符 | steps 示例用 harness 工具名、执行器只传单对象 | 执行器支持数组位置参数;文档/工具描述改 ns.method + 数组示例 |
| OneFlow app-start / notice 永不触发,hw/grades 每次刷新空转 | onStart 空实现、无 notice 监听、事件无条件双发 | 调度器启动跑一次 app-start;learn 数据按快照差发 hw/notice;成绩按报告签名变化发 grades |
| OnePage/OneFlow/白板等无检索/打开路径 | PAGE_ATOMS 缺一级页 | 补首页/THUBook/在线服务/待办/服务/收藏/所有 OnePage/OnePage 等页面原子 |
| 条件行「小组件槽位」桌面端无落点 | 未声明 visible/landOn | 加 visible + fallbackNote |
| 安装/管理主题行只高亮不动作 | 行无 go | 补 go 切插件市场/我的插件 + 主题筛选 |
| 插件市场搜索/分类无行,我的插件/市场行恒切 mine | 未注册/go 写死 | 补两行;切换行按当前视图取反 |
ext_wallpaper 宣称支持 tab 档、ext_voice 宣称 neural、ext_prefs 宣称 voiceTarget |
描述与实现不符 | 描述收窄到真实能力;prefs 不再写废弃字段 |
mcp_status 开关路径写成「设置 → 插件 → …」 |
入口层级已改 | 改为「设置浮层 → OneTHU Harness 段 → 高级配置」 |
仍未做(明确记录)¶
- board 标签仍不绑定
boardId:同时打开多块板会共用「当前板」;工作区快照里的 board 标签也恢复成当前板。修复需要扩展ExplorerTab.params类型与实例键,风险较高,留待专门批次。 - OH 对白板组件的操作仍以 portrait 为主,未覆盖 resize/pin/fold/opacity 与 custom props。
- 定时/事件流程的步骤白名单尚未限制高危门面方法(目前依赖插件权限门)。
三、OnePage:数据安全与操作¶
已修复¶
| 问题 | 修法 |
|---|---|
| P0:所有白板页拿挂载时快照整份 saveBoard,会覆盖其他入口新建/改名的板 | 改为 mutateBoards(读最新 doc → 改 → 存 → 广播),并订阅 onethu.boards.changed |
| OnePage 图标全应用无写入入口 | FolderIconPicker 改为操作 BoardDoc;列表页/OneGO 行菜单接入;OH 增 onePage_write op=icon + ext.onePageSetIcon |
| 改名只能去 OH | 列表页与 OneGO 行菜单加「重命名…」 |
onePage_place op=move 只改 cell、rect 不动 → 视觉无变化且假成功 |
同时写 rect: rectFromCell(cell);显式 found 判断,找不到板/件抛错 |
onePage_collect 文档写 kind:key 实际存 kind|key → 永久失效入口 |
facade 归一化首个 : 为 | 并校验;工具描述/示例统一为 kind|key |
onePage_write op=delete 高危无确认、忽略失败结果 |
未确认时返回 ConfirmNeeded;按 {ok:false,reason} 如实回话 |
| 新建 OnePage 不打开、列表页无法换图标/改名/排序 | 列表页/OneGO 补齐菜单;新建后设为当前并打开 |
| OnePage 列表标签文案残留「今日页」 | 改为「当前 OnePage / 系统板」;新建按钮改「新建 OnePage」 |
| OnePage 标签的标题/图标改完不刷新 | TabStrip 订阅 onethu.boards.changed 重算 |
四、OneFlow:从可见到可执行¶
- 手动运行不再只弹「去 OH 对话里说」:
registerFlowExecutor由 harness 注册执行器,OneGO 行直接runFlowNow,结果/错误 toast。 UserFlow增加enabled、lastError;UI 有启用/停用、失败原因展示;OH 新增ext_flow_update、flowSetEnabled,ext_flow_list返回 enabled/lastError。- 调度器:cron 用持久化
lastRun初始化(重启不立刻补跑);app-start 启动只触发一次;hw/notice/grades 只在数据变化时触发。 - 删除流程:UI 二次确认;门面校验存在性;Rust 不再对不存在 id 回「已删除」。
- 创建流程:门面校验 trigger 与 steps 非空,返回
{id},Rust 回显真实 id。 - 执行器支持数组位置参数(
args:["schedule"])与对象单参数;旧对象步骤仍兼容。
五、OH MCP:入方向协议修复¶
- P0:入方向 MCP server 的
initialize/tools/list只回裸 result(无jsonrpc/id),标准客户端握手即失败。现统一{jsonrpc:"2.0",id,result|error}。 notifications/*视为通知:无响应体,HTTP 202(不再回 -32601 错误)。OPTIONS预检 204 +Access-Control-Allow-Methods,网页端 MCP 客户端可用。- 新增 3 条 Rust 单测:信封形状、通知无体/未知方法错误、confirm 工具被扣下。
- 出方向:
parse_servers按 name 去重;UI 表单拒绝空名/重名(工具前缀mcp_<name>_会撞车)。 - 新增检索行「连接外部 MCP 服务器」(
oh-mcp-client),高级档有稳定锚点。
六、验证¶
| 项 | 结果 |
|---|---|
node tools/oh-route-onepage-browser-test.mjs |
24/24 |
node tools/usability-browser-test.mjs |
52/52 |
node tools/theme-home-browser-test.mjs |
80/80 |
cargo test -p onethu-harness-core --lib |
30/30 |
node tools/oh-routes-sync-test.mjs |
asset 60 行 = 注册表 60 行 |
node tools/search-landing-test.mjs / settings-search-coverage-test.mjs |
60/60 家族一致、标题别名自查通过 |
| desktop typecheck / build / guard:onegui / docs-prose-lint | 通过 |
| harness sidecar | build:harness 重新构建并放入 resources(4.3 MB) |
七、后续(已排队)¶
新版本扩展(组织 / 万物暂存箱 / 分享口令 / 个人与组织名片 / NFC 碰一碰 / 通讯录 / 强制清华云盘)已存档在
docs/plans/2026-10-18-organization-vault-share.md,按要求等本轮虫子收尾后再启动。