Omi Desktop 端到端测试特性向量:基于 Flow-Walker 的双通道优先级模型与 42 项桌面功能覆盖实战

原创2026-09-15 18:27:541,462 阅读
文章标签:人工智能AI 应用大模型语音后端移动开发桌面应用交互助手可穿戴MCP 服务RAG

Omi Desktop 端到端测试特性向量:基于 Flow-Walker 的双通道优先级模型与 42 项桌面功能覆盖实战

导读

本文档系统梳理 Omi 开源项目桌面 macOS 客户端的端到端(E2E)测试规划方法论——desktop/macos/e2e/feature-vector.md。该特性向量沿用移动端同源的两维优先级评分模型(layer_weight × session_frequency),并针对桌面端"无光标自动化"通道(omi-ctl 本地自动化桥 + 类型化 YAML 流程)额外引入 Bridge 评分,形成了一套可量化的功能优先级地图与分级置信度体系(T0/T1/T2/Fault/Live P2)。读完本文,你将掌握:如何用这套评分模型对 42 项桌面功能排序并分配测试资源、T2 密封(hermetic)资质与手动 Live P2 车道的边界划分、以及 Wave 1–8 迭代中真实落地的 32/32 流程全绿实践与已知缺口。


一、评分模型:两维优先级 + Bridge/Walker 双通道可自动化性

1.1 组合优先级公式

特性向量延续 Omi Issue Triage Guide 中提出的两维评分思路,其核心公式为:

Combined Priority = layer_weight × session_frequency
维度 取值
Core-to-mission(层权重) capture=5、understand=4、memory=4、intelligence=3、retrieval-action=3
Session frequency(会话频率) daily=3、weekly=2、setup-only=1

该公式的语义非常直观:与核心使命(捕获→理解→记忆→智能→检索/行动)越接近的功能层权重越高;用户使用越频繁的功能频率分越高。二者相乘后,捕获(capture)类功能天然获得最高优先级(最高 5×3=15),而检索/行动与智能层(3 的权重)即使每天使用也只有 9 分。这与文档中"Core Daily"分组(优先级 9–15)完全对应——比如屏幕捕获、音频录制、记忆浏览均落在最高区间。

1.2 Bridge 评分(0–3):omi-ctl / 类型化 YAML 车道

桌面端相比移动端新增了 Bridge 评分,衡量某个功能通过本地自动化桥(desktop/macos/scripts/omi-ctl + e2e/flows/*.yaml,步进类型 bridge.navigate / bridge.action)可被无光标自动化的程度:

分值 含义
3 存在密封变更(hermetic mutation)或深度快照动作
2 可导航 + 只读快照
1 存在接缝(seam)但需要种子数据/初始化(如捕获转录、本地认证)
0 仅手动通道(OAuth 弹窗、TCC、外部 URL、破坏性确认)

从 harness.md 可以看到 Bridge 车道的技术底座:scripts/omi-harness 通过本地自动化桥驱动"无光标"桌面体验检查,支持 bridge.navigate、bridge.action、visual.export、state.expect、ax.expect 等类型化步进。每一次运行都会调用 set_automation_ui_presentation 将桥/视觉工作置于 quiet 模式并在结束时恢复,即使某一步失败也如此——这保证了自动化过程不抢占真实鼠标焦点。

1.3 Walker 评分(0–3):agent-swift 辅助 Accessibility API

Walker 评分衡量通过 agent-swift(基于 macOS Accessibility API 的 CLI 工具,可点击元素、读取 AX 树、截屏)的可自动化程度:

分值 含义
3 完全可自动化(仅点击/按键、确定性、存在 AX 标识符)
2 部分可自动化(需要滚动、条件内容或时序等待)
1 需先完成系统设置(麦克风权限、账户关联),之后 walker 可验证
0 不可达(外部 OAuth 弹窗、OS 级对话框、真实支付)

1.4 车道偏好:Bridge 优先于 Walker

文档明确给出车道优先级原则:

Lane preference: Prefer bridge (T2 hermetic) over walker (manual Live P2). Walker reports below are historical flow-walker runs; qualification-tier confidence comes from desktop-core-harness.sh --tier 2.

也就是说:T2 密封资质置信度只来自 desktop-core-harness.sh --tier 2,而 walker 报告仅是历史性的 flow-walker 运行记录,不属于资质层级。这一原则在 CORE_E2E.md 中得到进一步印证:T2 为"密封(hermetic)资质层级"(约 15 分钟),要求 make dev-up 离线模式(enforced)、所有 tier <= 2 的流程加空间覆盖 Swift 测试;而 Live P2 是 tier: manual 的流程——walker / TCC / 外部 URL / 破坏性门槛,明确标注"not qualification tier"。


二、特性向量全表:42 项功能的三级分组

2.1 CORE DAILY(优先级 9–15):12 项核心每日功能

# 功能 层 优先级 Bridge Walker 覆盖状态
1 Dashboard——会话列表、刷新 intelligence (3) 9 2 2 ✅ home.yaml(导航 + conversation_list_snapshot)
2 Chat——发送消息、AI 响应 intelligence (3) 9 2 2 ✅ chat-hermetic.yaml
3 侧边栏导航——所有分区 retrieval-action (3) 9 2 3 ✅ navigation.yaml
4 Home 舞台(hub / chat / connect) intelligence (3) 9 2 2 ⛔️ 已退役:DashboardPage 曾是唯一渲染该舞台的视图且已删除(#12598);Home 现为 QueryShellHome,不报告舞台
5 捕获生命周期(密封转录接缝) capture (5) 15 2 1 ✅ capture-lifecycle.yaml
6 屏幕捕获(Rewind) capture (5) 15 0 2 ⚠️ 手动:rewind.yaml、screen-recording-permission.yaml(TCC)
7 音频录制(桌面麦克风) capture (5) 15 0 1 ⚠️ 手动:audio-recording.yaml(麦克风权限);新增 recording-finalization.yaml
8 记忆列表与浏览 memory (4) 12 2 2 ✅ memories.yaml(导航 + 搜索步骤)
9 记忆搜索 memory (4) 12 3 2 ✅ memory-depth.yaml + memories.yaml
10 任务——列表、刷新 retrieval-action (3) 9 3 2 ✅ tasks-crud.yaml + tasks.yaml
11 快速笔记(dashboard) intelligence (3) 9 2 2 ✅ quick-note.yaml
12 浮动条 / Ask Omi intelligence (3) 9 2 2 ✅ floating-bar-functional.yaml

源码印证:第 2 项 chat-hermetic.yaml 是 T2 密封聊天的典型代表。该流程以 tier: 2 运行,前置条件是 automation_bridge_ready,其核心步骤链为:reset_main_chat 重置主聊天 → bridge.navigate 到 dashboard(等待 chatFirstRoute: chat)→ ask_main_chat 发送标记查询(Reply with exactly [[MARKER:chat-hermetic]])→ wait_main_chat_idle(120s 超时)→ 断言 main_chat_snapshot 的 last_assistant_text 精确等于 MARKER:chat-hermetic(Rust OMI_LLM_STUB=1 下的确定性 stub 回复),并以 log.expect 校验 DesktopAutomationBridge: failed 不出现。第 4 项的退役决策也直接体现在 home.yaml 的描述中:该流程是 v0.12.119+ 重设计后唯一保留的 Home 流程,dashboard.yaml 随 DashboardPage 一并退役。

2.2 SECONDARY SURFACES(优先级 6–12):19 项次级表面(一等行)

# 功能 层 优先级 Bridge Walker 覆盖状态
13 会话详情(转录抽屉、分段) capture (5) 15 3 2 ✅ conversation-detail.yaml
14 会话分享 / 导出 retrieval-action (3) 6 2 2 ⚠️ 部分:conversation-sharing.yaml(分享链接探测;剪贴板/原生分享手动)
15 会话文件夹与星标 retrieval-action (3) 6 3 2 ✅ conversation-folders.yaml
16 说话人命名(People) understand (4) 8 3 1 ✅ speaker-naming.yaml(多说话人注入 + 分配)
17 记忆 CRUD(创建/编辑/删除) memory (4) 8 3 2 ✅ memory-crud.yaml
18 记忆可见性开关 memory (4) 8 3 2 ✅ memory-depth.yaml
19 记忆图谱可视化 memory (4) 8 2 2 ✅ memory-graph.yaml(API 计数;无 SceneKit)
20 记忆标签过滤 memory (4) 8 3 2 ✅ memory-depth.yaml
21 自定义词汇 understand (4) 8 3 2 ✅ vocabulary.yaml
22 目标追踪(dashboard 小组件) intelligence (3) 6 3 2 ✅ goals-dashboard.yaml
23 转录语言设置 understand (4) 8 3 3 ✅ language.yaml(设置 + 快照)
24 隐私开关(存储录音、追踪) — 5 2 2 ✅ privacy-settings.yaml(开关快照)
25 套餐 / 用量(计费) — 5 2 1 ✅ plan-usage.yaml(订阅快照)
26 应用 / 集成目录 retrieval-action (3) 6 2 2 ✅ apps-marketplace.yaml + ⚠️ 手动:apps.yaml
27 连接器导入(进度持久化) retrieval-action (3) 6 3 2 ✅ connector-import.yaml + ⚠️ 手动:connector-import-progress.yaml
28 推荐好友(一个月的 Operator) retrieval-action (3) 6 0 2 ⚠️ 手动:refer-external.yaml(顶栏 + 设置 → 复制链接)
29 删除账户(仅确认) — 5 0 2 ⚠️ 手动:delete-account.yaml(永不确认)
30 登出(本地认证 / 模拟器) — 5 1 2 ⚠️ 手动:logout.yaml(sign_out 桥;非生产 OAuth)
31 引导(首次启动 / 重置) — 5 1 1 ⚠️ 手动:onboarding-smoke.yaml——重置修复已落地;保持手动直到 2× 本地绿

源码印证:第 27 项 connector-import.yaml 在 CORE_E2E.md 的流程审计基线中对应 memory_log_import_probe 类型化封装(T2 密封);其进度 UI 版本 connector-import-progress.yaml 则是 tier: manual、manual do: 步进。第 16 项的 speaker-naming.yaml 通过多说话人 inject_multi 桥动作注入夹具并执行说话人分配,属于 Wave 6 新增的 T2 深度流程。

2.3 SETTINGS & SYSTEM(优先级 3–5):11 项设置与系统功能

# 功能 层 优先级 Bridge Walker 覆盖状态
32 设置——分区导航 — 5 2 3 ✅ settings-basic.yaml(General、Transcription、Privacy、Rewind、Notifications、About、Shortcuts、Advanced)
33 Rewind 设置 capture (5) 5 2 2 ✅ rewind-settings.yaml
34 账户信息 — 5 2 2 ✅ plan-usage.yaml(Account 分区 + 订阅快照)
35 AI Chat 模型设置 intelligence (3) 3 2 2 ✅ ai-chat-settings.yaml(非生产分区;生产仍重定向到 Advanced)
36 高级 / 开发者选项 — 3 2 2 ✅ settings-basic.yaml(advanced_settings_snapshot)
37 系统托盘菜单 — 5 0 3 ⚠️ 部分:由手动登出/引导间接覆盖
38 键盘快捷键(Cmd+1..6、Cmd+,) — 5 2 3 ✅ keyboard-shortcuts.yaml
39 通知设置 — 3 2 2 ✅ notifications-settings.yaml
40 关于页(版本信息) — 3 2 3 ✅ about-settings.yaml
41 认证(Sign In——Google/Apple) — 5 0 0 阻塞:外部 OAuth
42 连接器导入(密封探测) retrieval-action (3) 6 3 0 ✅ connector-import.yaml(与 #27 同一表面;进度 UI 保持手动)

桌面专属提示(来自特性向量末节的 Desktop-Specific Notes):

  • Bridge 优先:scripts/omi-ctl + e2e/flows/*.yaml,使用 bridge.navigate / bridge.action。
  • Walker 次之:agent-swift 用于手动 Live P2 车道与 TCC 依赖流程。
  • 侧边栏 AX 标识符:sidebar_dashboard、sidebar_chat、sidebar_memories、sidebar_tasks、sidebar_rewind、sidebar_apps、sidebar_settings。Refer a Friend 位于 profile 菜单弹出层,而非侧边栏项。
  • 系统托盘菜单项:openOmiFromMenu、checkForUpdates、resetOnboarding、reportIssue、signOut、quitApp。
  • View 菜单键盘快捷键:Cmd+1(Dashboard)、Cmd+2(Conversations)、Cmd+3(Memories)、Cmd+4(Tasks)、Cmd+5(Rewind)、Cmd+6(Apps)、Cmd+,(Settings)。
  • Beta 应用 Bundle ID:com.omi.computer-macos(flow-walker 默认)。
  • 开发 / 密封 Bundle:com.omi.omi-core-e2e,配合 make desktop-run-local(Auth 模拟器)。

三、Live P2 手动车道:破坏性门槛与系统权限流程

以下 tier: manual 的 Agent 本地流程不属于资质层级(T2),需通过 flow-walker / agent-swift 在已登录的命名 bundle 上逐个运行:

流程 为何手动 破坏性?
refer-external.yaml 从顶栏与 Settings 复制唯一的 Operator 推荐链接 否
delete-account.yaml 仅演练确认弹层;永不点击 Delete Permanently 是(受限)
logout.yaml 通过 Settings 登出;需要本地 Auth 模拟器(make desktop-run-local),非生产 OAuth 否
onboarding-smoke.yaml reset_onboarding 会重启应用;Wave 7 修复已落地——手动直到 2× 本地绿 是(本地重置)
audio-recording.yaml 麦克风 TCC 否
rewind.yaml Rewind 页面 + 权限状态 否
screen-recording-permission.yaml 屏幕录制 TCC + 系统设置 否
apps.yaml 市场浏览/过滤(walker) 否
connector-import-progress.yaml 实时导入进度 UI 否

硬性规则:不得将破坏性流程(delete-account、onboarding-smoke)提升到 T2 资质层级。

这条规则与 CORE_E2E.md 的"Hermetic vs live"边界一致:T2 密封要求 make dev-up 配合 PROVIDER_MODE=offline、Rust OMI_LLM_STUB=1、桥转录接缝——无真实 LLM、麦克风或 STT;Live P2 手动车道则专门承接 TCC、外部 URL、破坏性门槛和 OAuth 邻近路径。


四、剩余缺口(Remaining Gaps)与分级置信度

特性向量按阻塞因素(Blocker)对未完全覆盖的功能进行排名:

排名 功能 优先级 阻塞 备注
1 引导重置冒烟 5 应用重启 harness onboarding-smoke.yaml 保持手动直到 Wave 7 修复后 2× 本地绿
2 生产 OAuth 登录 5 外部浏览器 登出手动车道使用本地 Auth 模拟器
3 原生分享 / 剪贴板 6 OS 分享面板 conversation-sharing.yaml 仅探测分享链接
4 TCC 实时车道 15 麦克风 / 屏幕录制 audio-recording.yaml、rewind.yaml、screen-recording-permission.yaml
5 系统托盘深度 5 ROI 低 仅通过手动登出/引导部分覆盖

从 CORE_E2E.md 的"Change → tier map"可以反推这些缺口的工程含义:转录/音频捕获变更要求 T2;Rewind 工件持久化/恢复/隐私准入要求 T2;ChatProvider / agent 运行时要求 T0 + T3;侧边栏/导航仅需 T1;记忆/任务 CRUD 表面要求 T2;次级表面(详情、词汇、目标、计费、隐私变更)要求 T2 + 手动专用 Live P2。


五、Wave 1–8 迭代记录与诚实覆盖率总结

5.1 变更时间线(截至 2026-07-09)

  • Wave 1/2:次级表面 T2 密封流程落地——conversation-detail.yaml、memory-crud.yaml、vocabulary.yaml、goals-dashboard.yaml、plan-usage.yaml、privacy-settings.yaml、apps-marketplace.yaml、connector-import.yaml、conversation-folders.yaml、conversation-sharing.yaml。桥动作支撑变更与深度快照;生产认证、删除账户、登出、推荐好友的 Live P2 手动车道保持不变。
  • Wave 4:tasks-crud.yaml、memory-depth.yaml、语言保存、记忆搜索/过滤/可见性动作。
  • Wave 5:quick-note.yaml、about-settings.yaml、notifications-settings.yaml、rewind-settings.yaml、keyboard-shortcuts.yaml、扩展 settings-basic.yaml。
  • Wave 6:多说话人 inject_multi、speaker-naming.yaml T2、memory-graph.yaml。
  • Wave 7:reset_onboarding 损坏修复、非生产 AI Chat 分区 + ai-chat-settings.yaml;onboarding-smoke.yaml 保持手动。
  • Wave 8:32/32 个 T2 流程全绿(通过 omi-harness 手动资质;harness dev-up 因 8085 端口冲突被阻塞——见 CORE_E2E Failure playbook)。

5.2 覆盖率总结(诚实口径,2026-07-09,Wave 8 资质后)

类别 总数 ✅ 深度流程 ⚠️ 仅导航/手动/部分 ❌ / 阻塞
Core Daily 12 10 2 0
Secondary Surfaces 19 14 5 0
Settings & System 11 9 1 1
总计 42 33 8 1

T2 资质矩阵:32/32 个流程全绿(2026-07-09 通过 omi-harness 桥车道的手动资质;完整的 desktop-core-harness.sh --tier 2 因外部 Firestore 端口冲突被阻塞——见 CORE_E2E Failure playbook)。手动 Live P2 继续覆盖 TCC、OAuth、破坏性门槛和部分分享场景。

证据契约(来自 CORE_E2E.md):运行产物写入 .harness/desktop-core/<run-id>/{manifest.json, flows/, summary.md},通过时追加 latest-green;T2+ 清单必须包含 provider_mode(资质合格运行必须为 offline)。


六、实操:如何复现 T2 密封资质与手动车道

6.1 Hermetic T2(推荐——本地 Auth 模拟器 + 离线栈)

# 1. 启动本地栈(Typesense 需要 Docker)
PROVIDER_MODE=offline make dev-up

# 2. 以 harness profile 启动命名 bundle(自动以种子 alice 用户登录)
make desktop-run-local DESKTOP_APP_NAME=omi-core-e2e DESKTOP_USER=alice
# 注意 run.sh 打印的 Automation bridge 端口(与工作树相关,不总是 47777)

# 3. 在另一个终端运行 tier 2(使用 run.sh 输出的 --port)
cd desktop/macos
./scripts/desktop-core-harness.sh --tier 2 --bundle omi-core-e2e --port <PORT> --keep-stack

6.2 T1 冒烟(仅导航;可使用 Omi Dev 认证种子)

cd desktop/macos && OMI_APP_NAME=omi-core-e2e OMI_SKIP_TUNNEL=1 ./run.sh
./scripts/omi-auth-seed.sh com.omi.omi-core-e2e tmp/desktop-auth.json "/Applications/omi-core-e2e.app"
./scripts/desktop-core-harness.sh --tier 1 --bundle omi-core-e2e --port <PORT>

6.3 故障套件(chat 后端 5xx——自动启动 omi-fault-inject + omi-fault bundle)

cd desktop/macos
./scripts/desktop-core-harness.sh --fault-suite --port <PORT>

注意:不要混用 omi-auth-seed.sh(Omi Dev 生产会话)与 make desktop-run-local(Auth 模拟器)——否则应用将以未登录状态启动。

6.4 单个流程运行与工件检查

cd desktop/macos
python3 scripts/omi-harness run e2e/flows/chat-hermetic.yaml --lane bridge --port <PORT>
python3 scripts/omi-harness summarize latest
python3 scripts/omi-harness compare <before-run> <after-run> --markdown
python3 scripts/omi-harness cleanup --keep 10

失败排查(CORE_E2E Failure playbook 摘要):先读 manifest.json 获取 tier/git SHA/逐流程结果,再读 summary.md;失败流程打开 flows/<name>/ 查看 omi-harness 步进工件。T2 密封失败需确认 manifest.json 中 provider_mode: offline、dev-harness config-digest.json 中的 PROVIDER_MODE=offline、Rust 后端 OMI_LLM_STUB=1、桥 /health。经典故障"dev-up failed: Port 8085 for firestore is already in use by a foreign process"的处理:在持有端口的工作树执行 make dev-down,或设置独立的 OMI_INSTANCE / harness 状态根后再 PROVIDER_MODE=offline make dev-up。

6.5 分级阶梯总览(T0 → T3)

层级 位置 耗时 内容 命令
T0 Linux + macOS,CI <2 分钟 流程 lint、gauntlet --self-check;后端契约本地或 CI contracts 任务 --tier 0 / --self-check
T1 macOS agent-local ~5 分钟 所有 tier: 1 元数据的流程(桥车道) --tier 1
T2 macOS agent-local;资质层级 ~15 分钟 dev-up 离线(强制);所有 tier <= 2 流程 + 空间覆盖 Swift 测试 --tier 2
Fault macOS agent-local ~5 分钟 omi-fault-inject + omi-fault bundle;chat-fault-5xx.yaml(后端 5xx → 表面化聊天错误) --fault-suite
T3 macOS opt-in 30+ 分钟 Agent 连续性 gauntlet(实时 LLM/BYOK) --tier 3
Live P2 macOS agent-local 不定 tier: manual 流程——walker / TCC / 外部 URL / 破坏性门槛;非资质层级 omi-harness run e2e/flows/<name>.yaml --lane bridge

七、与移动端特性向量的关系

本桌面特性向量明确说明其"使用与移动端特性向量相同的两维优先级模型,外加为无光标自动化车道增加的 Bridge 评分"。对照 app/e2e/feature-vector.md 可以看到两者一脉相承:

  • 共享模型:Combined Priority = layer_weight × session_frequency,层权重取值完全一致(capture=5、understand=4、memory=4、intelligence=3、retrieval-action=3)。
  • Walker 评分语义一致(0–3,从"完全可自动化"到"不可达")。
  • 差异点:移动端 33 项功能仅用 Walker 单通道评分,桌面端 42 项功能因存在本地自动化桥(omi-ctl)而额外引入 Bridge 评分,并以此划分 T2 密封资质与手动 Live P2 车道。

移动端的历史演进也值得参考:BLE 设备流程最初评分为 walker=0(不可达),后在物理 Pixel 7a 上被证明可自动化,升级为 walker=1(需物理设备设置,之后 Agent 可通过 ADB + agent-flutter 驱动完整流程)——这提示特性向量是一份持续修订的活文档,评分会随自动化能力提升而调整。


八、参考与延伸阅读

登录后查看全文
Friend