Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
f4e11f6
Add desktop feature vector for flow-walker E2E coverage
beastoin Mar 20, 2026
ec377f6
Add desktop navigation flow (v2 format, 6 sidebar steps)
beastoin Mar 20, 2026
879fddf
Update feature vector with 6 published flow-walker reports
beastoin Mar 20, 2026
71d6e11
Update dashboard flow: use beta bundle ID
beastoin Mar 20, 2026
6c29c21
Update chat flow: use beta bundle ID
beastoin Mar 20, 2026
02eee17
Update memories flow: use beta bundle ID
beastoin Mar 20, 2026
3f3156e
Update tasks flow: use beta bundle ID
beastoin Mar 20, 2026
16f01ad
Update settings flow: use beta bundle ID
beastoin Mar 20, 2026
cd80885
Convert language flow to v2 format with quoted do: strings
beastoin Mar 20, 2026
9c43157
Merge remote-tracking branch 'origin/main' into sora/desktop-e2e-flows
beastoin Mar 20, 2026
bec848f
Remove video evidence from dashboard flow (desktop-only)
beastoin Mar 20, 2026
80ae43d
Remove video evidence from chat flow (desktop-only)
beastoin Mar 20, 2026
e259dc7
Remove video evidence from memories flow (desktop-only)
beastoin Mar 20, 2026
8bbc65a
Remove video evidence from tasks flow (desktop-only)
beastoin Mar 20, 2026
4a0fe85
Remove video evidence from settings flow (desktop-only)
beastoin Mar 20, 2026
fdd6979
Update report URLs after flow-walker Phase 11 re-verify
beastoin Mar 20, 2026
888b770
Update report URLs from fresh flow-walker runs (Phase 11)
beastoin Mar 20, 2026
f390e86
Update desktop SKILL.md with v2 flow format and report links
beastoin Mar 20, 2026
e44a23f
Add chat.snapshot.json for flow-walker replay cache
beastoin Mar 20, 2026
2e3f5dc
Add dashboard.snapshot.json for flow-walker replay cache
beastoin Mar 20, 2026
db78782
Add memories.snapshot.json for flow-walker replay cache
beastoin Mar 20, 2026
ec3cd98
Add navigation.snapshot.json for flow-walker replay cache
beastoin Mar 20, 2026
6e801ff
Add settings.snapshot.json for flow-walker replay cache
beastoin Mar 20, 2026
e583edf
Add tasks.snapshot.json for flow-walker replay cache
beastoin Mar 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 25 additions & 18 deletions desktop/e2e/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,33 +102,39 @@ System Tray Menu

Reference flows in `desktop/e2e/flows/*.yaml` describe the app's key user journeys. Read these to understand navigation paths, expected elements, and UI state at each step.

| Flow | Covers | What it describes |
|------|--------|-------------------|
| `flows/navigation.yaml` | SidebarView, DesktopHomeView, OmiApp | Sidebar icons, section switching, text input, scroll, tray menu |
| `flows/language.yaml` | SettingsPage, SettingsSidebar, SidebarView | Settings nav, Transcription, language mode toggle, picker |
| `flows/dashboard.yaml` | DashboardPage, GoalsWidget, TasksWidget | Goals CRUD, task toggle, embedded conversations |
| `flows/chat.yaml` | ChatPage, ChatProvider | Send message, AI response, message actions |
| `flows/memories.yaml` | MemoriesPage, MemoryGraphPage | Tag filtering, search, visibility toggle, memory graph |
| `flows/tasks.yaml` | TasksPage, TasksStore | Task categories, filters, create task, toggle completion |
| `flows/settings.yaml` | SettingsPage, SettingsSidebar | All 9 settings sections (General through About) |
| Flow | Covers | Steps | Report |
|------|--------|-------|--------|
| `flows/navigation.yaml` | SidebarView, DesktopHomeView | 6/6 PASS | [report](https://flow-walker.beastoin.workers.dev/runs/RVS7NChPvj.html) |
| `flows/dashboard.yaml` | DashboardPage, GoalsWidget, TasksWidget | 3/6 (3 skipped) | [report](https://flow-walker.beastoin.workers.dev/runs/ghCdGIUAA2.html) |
| `flows/chat.yaml` | ChatPage, ChatProvider | 5/5 PASS | [report](https://flow-walker.beastoin.workers.dev/runs/z62Nll0IzR.html) |
| `flows/memories.yaml` | MemoriesPage, MemoryGraphPage | 5/6 (1 skipped) | [report](https://flow-walker.beastoin.workers.dev/runs/Mkp6ahc12I.html) |
| `flows/tasks.yaml` | TasksPage, TasksStore | 4/5 (1 skipped) | [report](https://flow-walker.beastoin.workers.dev/runs/ealB_-UdqS.html) |
| `flows/settings.yaml` | SettingsPage, SettingsSidebar | 9/9 PASS | [report](https://flow-walker.beastoin.workers.dev/runs/RoTW8GeljN.html) |
| `flows/language.yaml` | SettingsPage, SettingsSidebar | 5 steps | — |

When you modify a Swift file, check if any flow's `covers:` includes it. That flow describes the user journey your change affects.

### Adding a New Flow
Create `desktop/e2e/flows/<name>.yaml`:
Create `desktop/e2e/flows/<name>.yaml` in v2 format:
```yaml
version: 2
name: my-flow
description: What this flow covers
app: com.omi.computer-macos
covers:
- Desktop/Sources/path/to/YourView.swift
setup: normal # normal | fresh_auth | signed_out
- desktop/Desktop/Sources/path/to/YourView.swift
preconditions:
- auth_ready
steps:
- name: Step description
click: { type: image, label: "gearshape.fill" }
screenshot: step-name
- name: Verify result
assert: { text: "Expected Text" }
- id: S1
name: Step description
do: "Click the element (identifier: my_element). Verify the page loads."
expect:
interactive_count: { min: 5 }
text_visible:
- Expected Text
```
**Important:** Always use quoted strings for `do:` fields (not YAML `>` or `|`).

## Verification & Evidence

Expand All @@ -151,8 +157,9 @@ After making changes, verify them in the live app:
## Guard Conditions

**NEVER:**
- Automate the production app (`com.omi.computer-macos`)
- Kill or restart the production Omi app
- Use development env vars to bypass auth — test real auth flows
- Set `hasCompletedOnboarding` to skip onboarding — test the real flow
- Modify source code to make tests pass — report the failure instead

**NOTE:** The beta app (`com.omi.computer-macos`) is the standard target for flow-walker E2E testing. The dev app (`com.omi.desktop-dev`) is for local development only.
123 changes: 123 additions & 0 deletions desktop/e2e/feature-vector.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
# Omi Desktop App Feature Vector for Flow-Walker
## Updated 2026-03-20

### Purpose
Prioritized feature map to guide flow-walker E2E coverage of core Omi desktop macOS app flows. Uses the same two-dimensional scoring model as the mobile feature vector.

---

## Scoring Model

**Combined Priority** = `layer_weight × session_frequency`

| Dimension | Values |
|-----------|--------|
| **Core-to-mission** (layer weight) | capture=5, understand=4, memory=4, intelligence=3, retrieval-action=3 |
| **Session frequency** | daily=3, weekly=2, setup-only=1 |

**Walker Score** (0-3) — desktop-specific (agent-swift via macOS Accessibility API):
- 3 = fully automatable (click/press-only, deterministic, AX identifiers present)
- 2 = partially automatable (needs scroll, conditional content, or timing waits)
- 1 = needs system setup first (microphone permission, account linking), then walker can verify
- 0 = unreachable (external OAuth popup, OS-level dialog, real payment)

> **Note:** Desktop walker uses `agent-swift` (CGEvent click + AXPress) instead of mobile's `agent-flutter` (Marionette). All sidebar items have AX identifiers (`sidebar_dashboard`, `sidebar_chat`, etc.), making navigation highly automatable.

---

## Feature Vector (sorted by priority × walker_score)

### CORE DAILY (priority 9-15, walker_score 2-3)

| # | Feature | Layer | Priority | Walker | Coverage Status |
|---|---------|-------|----------|--------|-----------------|
| 1 | Dashboard — goals widget, tasks, conversations | intelligence (3) | 9 | 3 | ✅ flow: dashboard.yaml (6 steps) |
| 2 | Chat — send message, AI response, actions | intelligence (3) | 9 | 2 | ✅ flow: chat.yaml (5 steps) |
| 3 | Sidebar navigation — all 7 sections | retrieval-action (3) | 9 | 3 | ✅ flow: navigation.yaml |
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Feature marked ✅ "all 7 sections" but flow only covers 6

Row #3 marks "Sidebar navigation — all 7 sections" as ✅ covered by navigation.yaml, but the navigation.yaml flow only steps through 6 sections (Dashboard, Chat, Memories, Tasks, Apps, Settings). The Rewind section is missing from the flow.

This creates a false impression of complete coverage. Consider either:

  • Adding a Rewind step to navigation.yaml (the sidebar_rewind AX identifier is already noted in the Desktop-Specific Notes section), or
  • Updating the coverage status to ⚠️ partial to reflect the missing Rewind step
Suggested change
| 3 | Sidebar navigation — all 7 sections | retrieval-action (3) | 9 | 3 | flow: navigation.yaml |
| 3 | Sidebar navigation — all 7 sections | retrieval-action (3) | 9 | 3 | ⚠️ partial: flow: navigation.yaml (6/7 sections, missing Rewind) |

| 4 | Conversation list & browse (dashboard embedded) | capture (5) | 15 | 2 | ✅ flow: dashboard.yaml |
| 5 | Screen capture (Rewind) | capture (5) | 15 | 2 | ❌ needs flow |
| 6 | Audio recording (desktop mic) | capture (5) | 15 | 1 | ❌ needs flow |
| 7 | Memory list & browse | memory (4) | 12 | 2 | ✅ flow: memories.yaml (6 steps) |
| 8 | Memory search | memory (4) | 12 | 2 | ✅ flow: memories.yaml |
| 9 | Tasks — categories, filters, create, toggle | retrieval-action (3) | 9 | 2 | ✅ flow: tasks.yaml (5 steps) |
| 10 | Quick Note (dashboard) | intelligence (3) | 9 | 2 | ⚠️ partial (in dashboard.yaml) |

### CORE WEEKLY (priority 6-12, walker_score 1-2)

| # | Feature | Layer | Priority | Walker | Coverage Status |
|---|---------|-------|----------|--------|-----------------|
| 11 | Memory visibility toggle | memory (4) | 8 | 2 | ✅ flow: memories.yaml |
| 12 | Memory graph visualization | memory (4) | 8 | 2 | ✅ flow: memories.yaml |
| 13 | Memory tag filtering | memory (4) | 8 | 2 | ✅ flow: memories.yaml |
| 14 | Transcription language settings | understand (4) | 8 | 3 | ✅ flow: language.yaml |
| 15 | Language mode toggle (Auto/Single) | understand (4) | 8 | 3 | ✅ flow: language.yaml |
| 16 | Goals CRUD (create, update, delete) | intelligence (3) | 6 | 2 | ✅ flow: dashboard.yaml |
| 17 | Apps/Integrations marketplace | retrieval-action (3) | 6 | 2 | ❌ needs flow |
| 18 | Refer a Friend | retrieval-action (3) | 6 | 2 | ❌ needs flow |

### SETTINGS & SYSTEM (priority 3-5, walker_score 1-3)

| # | Feature | Layer | Priority | Walker | Coverage Status |
|---|---------|-------|----------|--------|-----------------|
| 19 | Settings — all 9 sections | — | 5 | 3 | ✅ flow: settings.yaml (9 steps) |
| 20 | General preferences | — | 5 | 3 | ✅ flow: settings.yaml |
| 21 | Rewind settings | capture (5) | 5 | 2 | ✅ flow: settings.yaml |
| 22 | Privacy settings | — | 5 | 2 | ✅ flow: settings.yaml |
| 23 | Account info | — | 5 | 2 | ✅ flow: settings.yaml |
| 24 | AI Chat model settings | intelligence (3) | 3 | 2 | ✅ flow: settings.yaml |
| 25 | Advanced / Developer options | — | 3 | 2 | ✅ flow: settings.yaml |
| 26 | System tray menu | — | 5 | 3 | ✅ flow: navigation.yaml |
| 27 | Keyboard shortcuts (Cmd+1..6, Cmd+,) | — | 5 | 3 | ✅ flow: navigation.yaml |
| 28 | Onboarding (first launch) | — | 5 | 1 | ❌ needs fresh state |
| 29 | Auth (Sign In / Sign Out) | — | 5 | 0 | ❌ external OAuth |
| 30 | Notifications settings | — | 3 | 2 | ✅ flow: settings.yaml |
| 31 | About page (version info) | — | 3 | 3 | ✅ flow: settings.yaml |

---

## Remaining Gaps

| Rank | Feature | Priority | Blocker | Notes |
|------|---------|----------|---------|-------|
| 1 | Screen capture (Rewind) | 15 | Needs screen recording permission | Rewind page exists, AX identifiers unknown — needs exploration |
| 2 | Audio recording (desktop mic) | 15 | Needs microphone permission grant | Start Recording button visible on dashboard but mic requires OS dialog |
| 3 | Apps/Integrations | 6 | No flow written | Apps page accessible via sidebar_apps — should be straightforward |
| 4 | Onboarding | 5 | Needs fresh/reset state | Reset Onboarding available in tray menu but causes state corruption (known issue) |
| 5 | Auth | 5 | External OAuth | Google/Apple Sign-In opens browser — not automatable |

---
Comment on lines +79 to +88
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Remaining Gaps table is incomplete — 2 of 7 gaps are missing

The Coverage Summary at the bottom of this file correctly identifies 7 total gaps, but the Remaining Gaps table only lists 5 items. The two missing gaps are:

  • Feature Restructuring #10 — Quick Note (dashboard): Listed as ⚠️ partial in the CORE DAILY table and counted in the "3 gaps" for Core Daily (the note says "quick note partial"), but not mentioned in the Remaining Gaps table.
  • Feature fix: Fix device search for Android #18 — Refer a Friend: Listed as ❌ needs flow in the CORE WEEKLY table and counted in the "2 gaps" for Core Weekly, but is missing from the Remaining Gaps table.

Both should be added to keep the Remaining Gaps table consistent with the Coverage Summary. For example:

| 4 | Quick Note (dashboard) | 9 | Partial coverage only | quick_note step exists in dashboard.yaml but not independently verified |
| 5 | Refer a Friend | 6 | No flow written | sidebar_refer_a_friend AX identifier is available |


## Published Flow-Walker Reports

| Flow | Steps | Result | Report URL |
|------|-------|--------|------------|
| navigation | 6/6 | PASS | flow-walker.beastoin.workers.dev/runs/RVS7NChPvj.html |
| dashboard | 3/6 | PASS (3 skipped) | flow-walker.beastoin.workers.dev/runs/ghCdGIUAA2.html |
| chat | 5/5 | PASS | flow-walker.beastoin.workers.dev/runs/z62Nll0IzR.html |
| memories | 5/6 | PASS (1 skipped) | flow-walker.beastoin.workers.dev/runs/Mkp6ahc12I.html |
| tasks | 4/5 | PASS (1 skipped) | flow-walker.beastoin.workers.dev/runs/ealB_-UdqS.html |
| settings | 9/9 | PASS | flow-walker.beastoin.workers.dev/runs/RoTW8GeljN.html |

---

## Coverage Summary

| Category | Total Features | Covered | Gaps |
|----------|---------------|---------|------|
| Core Daily (capture, intelligence) | 10 | 7 | 3 (screen capture, audio recording, quick note partial) |
| Core Weekly (memory, understand, retrieval) | 8 | 6 | 2 (apps, refer) |
| Settings & System | 13 | 11 | 2 (onboarding, auth) |
| **Total** | **31** | **24** | **7** |

---

## Desktop-Specific Notes

- **agent-swift** is the automation tool (not agent-flutter). Uses macOS Accessibility API.
- **click** for SwiftUI elements (sidebar icons, NavigationLink). **press** for AppKit buttons (Settings sidebar sections).
- Sidebar AX identifiers: `sidebar_dashboard`, `sidebar_chat`, `sidebar_memories`, `sidebar_tasks`, `sidebar_rewind`, `sidebar_apps`, `sidebar_settings`, `sidebar_refer_a_friend`, `sidebar_discord`
- System tray menu items: `openOmiFromMenu`, `checkForUpdates`, `resetOnboarding`, `reportIssue`, `signOut`, `quitApp`
- Keyboard shortcuts via View menu: Cmd+1 (Dashboard), Cmd+2 (Chat), Cmd+3 (Memories), Cmd+4 (Tasks), Cmd+5 (Rewind), Cmd+6 (Apps), Cmd+, (Settings)
- Beta app bundle ID: `com.omi.computer-macos` (use for flow-walker runs)
- Dev app bundle ID: `com.omi.desktop-dev` (skip unless dev-specific testing)
- GUI user prefix required on SSH: `sudo launchctl asuser 501 sudo -u beastoinagents <cmd>`
46 changes: 46 additions & 0 deletions desktop/e2e/flows/chat.snapshot.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
"version": 1,
"flow": "chat",
"flowHash": "efb697d6b68af93b",
"device": {
"model": "unknown",
"resolution": "unknown"
},
"createdAt": "2026-03-20T07:03:04.855Z",
"runId": "ycYUEqE",
"totalDurationMs": 286000,
"verifySteps": [
"S1",
"S2",
"S3",
"S4",
"S5"
],
"steps": {
"S1": {
"kind": "action",
"waitAfterMs": 200,
"durationMs": 50000
},
"S2": {
"kind": "action",
"waitAfterMs": 200,
"durationMs": 108000
},
"S3": {
"kind": "verify",
"waitAfterMs": 200,
"durationMs": 62000
},
"S4": {
"kind": "action",
"waitAfterMs": 200,
"durationMs": 35000
},
"S5": {
"kind": "action",
"waitAfterMs": 500,
"durationMs": 31000
}
}
}
4 changes: 1 addition & 3 deletions desktop/e2e/flows/chat.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@
version: 2
name: chat
description: Chat flow — navigate to Chat page, send a message, verify AI response streams, test message actions (copy, regenerate), browse conversation history
app: com.omi.desktop-dev
evidence:
video: true
app: com.omi.computer-macos
covers:
- desktop/Desktop/Sources/MainWindow/Pages/ChatPage.swift
- desktop/Desktop/Sources/Chat/ChatProvider.swift
Expand Down
52 changes: 52 additions & 0 deletions desktop/e2e/flows/dashboard.snapshot.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{
"version": 1,
"flow": "dashboard",
"flowHash": "16f607bc98c082c2",
"device": {
"model": "unknown",
"resolution": "unknown"
},
"createdAt": "2026-03-20T06:57:42.156Z",
"runId": "_iDoTIw",
"totalDurationMs": 498000,
"verifySteps": [
"S1",
"S2",
"S3",
"S4",
"S5",
"S6"
],
"steps": {
"S1": {
"kind": "action",
"waitAfterMs": 200,
"durationMs": 68000
},
"S2": {
"kind": "action",
"waitAfterMs": 200,
"durationMs": 187000
},
"S3": {
"kind": "verify",
"waitAfterMs": 200,
"durationMs": 78000
},
"S4": {
"kind": "verify",
"waitAfterMs": 200,
"durationMs": 17000
},
"S5": {
"kind": "action",
"waitAfterMs": 200,
"durationMs": 46000
},
"S6": {
"kind": "verify",
"waitAfterMs": 500,
"durationMs": 102000
}
}
}
4 changes: 1 addition & 3 deletions desktop/e2e/flows/dashboard.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@
version: 2
name: dashboard
description: Dashboard flow — verify productivity widgets load, create/update/delete goals, toggle task completion, view embedded conversations
app: com.omi.desktop-dev
evidence:
video: true
app: com.omi.computer-macos
covers:
- desktop/Desktop/Sources/MainWindow/Pages/DashboardPage.swift
- desktop/Desktop/Sources/MainWindow/Components/GoalsWidget.swift
Expand Down
Loading
Loading