Omi Desktop 端到端测试特性向量:基于 Flow-Walker 的双通道优先级模型与 42 项桌面功能覆盖实战
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.yamlT2、memory-graph.yaml。 - Wave 7:
reset_onboarding损坏修复、非生产 AI Chat 分区 +ai-chat-settings.yaml;onboarding-smoke.yaml保持手动。 - Wave 8:32/32 个 T2 流程全绿(通过
omi-harness手动资质;harnessdev-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 驱动完整流程)——这提示特性向量是一份持续修订的活文档,评分会随自动化能力提升而调整。
八、参考与延伸阅读
- 特性向量主文档:desktop/macos/e2e/feature-vector.md
- 桌面核心 E2E 分级阶梯与失败手册:desktop/macos/e2e/CORE_E2E.md
- 体验 harness(车道、类型化步进、工件):desktop/macos/e2e/harness.md
- 桌面 App 流程探索技能(含 Screen Map 与已知流程表):desktop/macos/e2e/SKILL.md
- 移动端特性向量(同源评分模型):app/e2e/feature-vector.md
- 类型化流程目录(约 80 个 YAML):desktop/macos/e2e/flows/
- 核心 harness 入口脚本:desktop/macos/scripts/desktop-core-harness.sh、桥控制 CLI desktop/macos/scripts/omi-ctl
- 密封聊天天流程样例:desktop/macos/e2e/flows/chat-hermetic.yaml、Home 流程样例 desktop/macos/e2e/flows/home.yaml