# Test Coverage Matrix Canonical mapping of every product feature to its test source(s). Drives gap-fill PRs (#967, #968, #969, #970, #971) under epic #773. **Status legend** | Symbol | Meaning | | ------ | ----------------------------------------------------------------------- | | ✅ | Covered — at least one test asserts the behaviour | | 🟡 | Partial — touched by a broader spec, no dedicated assertion | | ❌ | Missing — no test today | | 🚫 | Not driver-automatable — manual smoke (release-cut checklist, see #971) | **Layer abbreviations** | Code | Layer | | ---- | ------------------------------------------------------------------------------------ | | `RU` | Rust unit (`#[cfg(test)]` inside `src/`) | | `RI` | Rust integration (`tests/*.rs`) | | `VU` | Vitest unit (`app/src/**/*.test.ts(x)`) | | `WD` | WDIO E2E (`app/test/e2e/specs/*.spec.ts`) — Linux `tauri-driver` + macOS Appium Mac2 | | `MS` | Manual smoke (release-cut checklist) | **Update contract** — when a PR adds, removes, or changes a feature leaf, the matrix row must be updated in the same PR. Tracking guard: see #965. --- ## 0. Application Lifecycle ### 0.1 Application Download | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ---------------------------- | ----- | ------------------------------- | ------ | ------------------------------------- | | 0.1.1 | Direct Download Access | MS | release-manual-smoke (see #971) | 🚫 | DMG hosting + version landing page | | 0.1.2 | Version Compatibility Check | MS | release-manual-smoke | 🚫 | Driver cannot assert OS-version gates | | 0.1.3 | Corrupted Installer Handling | MS | release-manual-smoke | 🚫 | Mutated DMG validation; manual repro | ### 0.2 Installation & Launch | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ------------------------------- | ----- | -------------------- | ------ | ---------------------------------------- | | 0.2.1 | DMG Installation Flow | MS | release-manual-smoke | 🚫 | OS-level Finder drag | | 0.2.2 | Gatekeeper Validation | MS | release-manual-smoke | 🚫 | OS-level signature check | | 0.2.3 | Code Signing Verification | MS | release-manual-smoke | 🚫 | `codesign --verify` capture in checklist | | 0.2.4 | First Launch Permissions Prompt | MS | release-manual-smoke | 🚫 | TCC prompts non-driver-automatable | ### 0.3 Updates & Reinstallation | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ----------------------------- | ----- | -------------------------------------------------- | ------ | ------------------------------------- | | 0.3.1 | Auto Update Check | RU+RI+MS | `src/openhuman/update/` (Rust unit), `tests/json_rpc_e2e.rs`, release smoke | 🟡 | Core check/update policy covered; desktop prompt + release upgrade still manual | | 0.3.2 | Forced Update Handling | MS | release-manual-smoke | 🚫 | End-to-end gating verified at release | | 0.3.3 | Reinstall with Existing State | MS | release-manual-smoke | 🚫 | Workspace persistence on reinstall | | 0.3.4 | Clean Uninstall | MS | release-manual-smoke | 🚫 | OS removal paths | --- ## 1. Authentication & Identity ### 1.1 Multi-Provider Authentication | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ----------------- | ----- | --------------------------------------- | ------ | ----------------------------------------------- | | 1.1.1 | Google Login | WD | `app/test/e2e/specs/login-flow.spec.ts` | ✅ | Deep-link branch covered | | 1.1.2 | GitHub Login | WD | `login-flow.spec.ts` | ✅ | Deep-link branch covered | | 1.1.3 | Twitter (X) Login | WD | `login-flow.spec.ts` | 🟡 | Generic OAuth path; assert provider tag in #968 | | 1.1.4 | Discord Login | WD | `login-flow.spec.ts` | 🟡 | Same — discord branch unasserted | ### 1.2 Account Management | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | -------------------------- | ----- | --------------------------------------------- | ------ | -------------------------------------------- | | 1.2.1 | Account Creation & Mapping | WD+RI | `login-flow.spec.ts`, `tests/json_rpc_e2e.rs` | ✅ | | | 1.2.2 | Multi-Provider Linking | WD | _missing_ — tracked #968 | ❌ | Need spec linking 4 providers to one account | | 1.2.3 | Duplicate Account Handling | WD | _missing_ — tracked #968 | ❌ | Collision UX path | ### 1.3 Session Management | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ---------------------- | ----- | --------------------------------------- | ------ | ------------------------- | | 1.3.1 | Token Issuance | WD+RI | `login-flow.spec.ts`, `json_rpc_e2e.rs` | ✅ | | | 1.3.2 | Session Persistence | WD | `logout-relogin-onboarding.spec.ts` | ✅ | | | 1.3.3 | Refresh Token Rotation | VU | _missing_ — tracked #968 | ❌ | Slice-level refresh logic | ### 1.4 Logout & Revocation | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ------------------ | ----- | ----------------------------------- | ------ | ---------------------------------- | | 1.4.1 | Session Logout | WD | `logout-relogin-onboarding.spec.ts` | ✅ | | | 1.4.2 | Global Logout | WD | _missing_ — tracked #968 | ❌ | Multi-session invalidation | | 1.4.3 | Token Invalidation | WD | _missing_ — tracked #968 | ❌ | Server-side revocation propagation | --- ## 2. Permissions & System Access ### 2.1 macOS Permissions | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | --------------------------- | ----- | -------------------- | ------ | ------------------- | | 2.1.1 | Accessibility Permission | MS | release-manual-smoke | 🚫 | TCC OS-level prompt | | 2.1.2 | Input Monitoring Permission | MS | release-manual-smoke | 🚫 | TCC OS-level prompt | | 2.1.3 | Screen Recording Permission | MS | release-manual-smoke | 🚫 | TCC OS-level prompt | | 2.1.4 | Microphone Permission | MS | release-manual-smoke | 🚫 | TCC OS-level prompt | ### 2.2 Permission Lifecycle | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | --------------------------------- | ----- | ------------------------------ | ------ | ------------------------------ | | 2.2.1 | Permission Grant Flow | RU | `src/openhuman/accessibility/` | 🟡 | Core branch covered; UX manual | | 2.2.2 | Permission Denial Handling | RU | `src/openhuman/accessibility/` | 🟡 | Same | | 2.2.3 | Permission Re-Sync / Refresh | WD | _missing_ — tracked #968 | ❌ | App-restart re-sync | | 2.2.4 | Partial Permission State Handling | WD | _missing_ — tracked #968 | ❌ | macOS-only spec | --- ## 3. Local AI Runtime (Ollama + LM Studio) ### 3.1 Model Management | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ----------------------------- | ----- | -------------------------------------------------------- | ------ | ----- | | 3.1.1 | Model Detection | RU+WD | `src/openhuman/local_ai/`, `local-model-runtime.spec.ts` | ✅ | | | 3.1.2 | Model Download & Installation | WD | `local-model-runtime.spec.ts` | ✅ | | | 3.1.3 | Model Version Handling | RU | `src/openhuman/local_ai/model_ids.rs` | ✅ | | | 3.1.4 | LM Studio Model Discovery | RU+RI | `src/openhuman/local_ai/service/ollama_admin_tests.rs`, `tests/json_rpc_e2e.rs` | ✅ | Uses LM Studio's OpenAI-compatible `/v1/models` surface | | 3.1.5 | Model Context-Window Requirement Gate | RU+VU | `src/openhuman/inference/local/model_requirements.rs`, `src/openhuman/inference/local/ollama.rs`, `src/openhuman/inference/local/service/ollama_admin_tests.rs`, `app/src/components/settings/panels/local-model/ModelStatusSection.test.tsx` | ✅ | Rejects Ollama models whose native context window is below the memory-layer minimum (`local_ai.model_context_check`) | ### 3.2 Runtime Execution | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ---------------------------------- | ----- | ---------------------------------- | ------ | ----------------------------------------- | | 3.2.1 | Local Inference Execution | WD | `local-model-runtime.spec.ts` | ✅ | | | 3.2.2 | Resource Handling (CPU/GPU/Memory) | RU | `src/openhuman/local_ai/device.rs` | 🟡 | Detection unit; runtime constraint manual | | 3.2.3 | Runtime Failure Handling | RU+WD | `local-model-runtime.spec.ts` | ✅ | | | 3.2.4 | LM Studio Chat Completions | RU+RI | `src/openhuman/local_ai/service/public_infer_tests.rs`, `tests/json_rpc_e2e.rs` | ✅ | Covers prompt/chat success and non-success status errors | ### 3.3 Runtime Configuration #### 3.3.1 RAM Allocation Control | ID | Feature | Layer | Test path(s) | Status | Notes | | ------- | -------------------------- | ----- | -------------------------------------------- | ------ | ----------------------------------- | | 3.3.1.1 | RAM Limit Selection | VU | `app/src/components/settings/` (panel-level) | 🟡 | UI present; assertion shallow | | 3.3.1.2 | RAM Availability Detection | RU | `src/openhuman/local_ai/device.rs` | ✅ | | | 3.3.1.3 | Over-Allocation Prevention | RU | `src/openhuman/local_ai/ops.rs` | 🟡 | Guard exists; explicit test pending | | 3.3.1.4 | Under-Allocation Handling | RU | `src/openhuman/local_ai/ops.rs` | 🟡 | Same | #### 3.3.2 Dynamic Resource Adjustment | ID | Feature | Layer | Test path(s) | Status | Notes | | ------- | ------------------------------- | ----- | ------------ | ------ | ------------------ | | 3.3.2.1 | Runtime Scaling Based on Load | RU | _missing_ | ❌ | Track in follow-up | | 3.3.2.2 | Model Switching Based on Memory | RU | _missing_ | ❌ | Track in follow-up | #### 3.3.3 Configuration Persistence | ID | Feature | Layer | Test path(s) | Status | Notes | | ------- | ----------------- | ----- | ----------------------------- | ------ | --------------------- | | 3.3.3.1 | Save RAM Settings | VU | _missing_ | ❌ | Settings slice | | 3.3.3.2 | Apply on Restart | WD | `local-model-runtime.spec.ts` | 🟡 | Restart not exercised | | 3.3.3.3 | Reset to Default | VU | _missing_ | ❌ | | | 3.3.3.4 | Provider Selection Persistence | RU+RI+VU | `src/openhuman/config/ops_tests.rs`, `tests/json_rpc_e2e.rs`, `app/src/utils/tauriCommands/config.test.ts` | ✅ | Covers `lm_studio` normalization and config round-trip | --- ## 4. Chat Interface (Core Interaction) ### 4.1 Chat Sessions | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ---------------------- | ----- | ---------------------------------------------------------------- | ------ | ------------------------------------- | | 4.1.1 | Session Creation | WD | `conversations-web-channel-flow.spec.ts` | ✅ | | | 4.1.2 | Session Persistence | WD | `conversations-web-channel-flow.spec.ts` | ✅ | | | 4.1.3 | Multi-Session Handling | WD | `agent-review.spec.ts`, `conversations-web-channel-flow.spec.ts` | 🟡 | No dedicated multi-thread switch test | ### 4.2 Messaging | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ---------------------- | ----- | ----------------------------------------------------------------- | ------ | --------------------------- | | 4.2.1 | User Message Handling | WD+RI | `conversations-web-channel-flow.spec.ts`, `tests/json_rpc_e2e.rs` | ✅ | | | 4.2.2 | AI Response Generation | WD | `agent-review.spec.ts` | ✅ | Mock LLM | | 4.2.3 | Streaming Responses | RI | `tests/json_rpc_e2e.rs` | 🟡 | UI streaming assertion thin | ### 4.3 Tool Invocation | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | -------------------------- | ----- | ----------------------------------------------------------- | ------ | ----- | | 4.3.1 | Tool Trigger via Chat | WD | `skill-execution-flow.spec.ts`, `skill-multi-round.spec.ts` | ✅ | | | 4.3.2 | Permission-Based Execution | RU+WD | `src/openhuman/tools/`, `skill-execution-flow.spec.ts` | ✅ | | | 4.3.3 | Tool Failure Handling | WD | `skill-execution-flow.spec.ts` | ✅ | | | 4.3.4 | Subagent Mascot Visualization | VU | `app/src/features/human/SubMascotLayer.test.tsx`, `app/src/features/human/HumanPage.test.tsx` | ✅ | Renders spawned/completed/failed subagent timeline rows as colored companion mascots with activity bubbles | --- ## 5. Built-in Intelligence Skills ### 5.1 Screen Intelligence | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ------------------ | ----- | ------------------------------------------------------------------------ | ------ | ----- | | 5.1.1 | Screen Capture | RI | `tests/screen_intelligence_vision_e2e.rs` | ✅ | | | 5.1.2 | Context Extraction | RI | `tests/screen_intelligence_vision_e2e.rs` | ✅ | | | 5.1.3 | Memory Injection | RI | `tests/memory_graph_sync_e2e.rs` | ✅ | | ### 5.2 Text Autocomplete | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ---------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ----------------------------------------------------------------------------------- | | 5.2.1 | Inline Suggestion Generation | MS+WD | `app/test/e2e/specs/autocomplete-flow.spec.ts` (settings surface only); release-manual-smoke for real inline-gen | 🟡 | Settings panel mounts (this PR); inline-gen requires macOS TCC grants — manual only | | 5.2.2 | Debounce Handling | VU | `app/src/features/autocomplete/__tests__/useAutocompleteSkillStatus.test.tsx` (this PR — status surface); core debounce timing is Rust-side | ✅ | Was ❌ — status branches now covered | | 5.2.3 | Acceptance Trigger | MS | release-manual-smoke (#971) | 🟡 | Real keypress acceptance into a third-party text field — not driver-automatable | ### 5.3 Voice Intelligence | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ------------------------- | ----- | -------------------- | ------ | ----- | | 5.3.1 | Voice Input Capture | WD | `voice-mode.spec.ts` | ✅ | | | 5.3.2 | Speech-to-Text Processing | WD | `voice-mode.spec.ts` | ✅ | | | 5.3.3 | Voice Command Execution | WD | `voice-mode.spec.ts` | ✅ | | | 5.3.4 | Mascot Voice Selection | VU | `app/src/store/__tests__/mascotSlice.test.ts`, `app/src/components/settings/panels/__tests__/VoicePanel.test.tsx`, `app/src/features/human/useHumanMascot.test.ts` (this PR) | ✅ | Slice validation + persist REHYDRATE, Settings picker UI (#1762), `synthesizeSpeech` voiceId override propagation | --- ## 6. System Tools & Agent Capabilities ### 6.1 File System | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ---------------------------- | ----- | ---------------------------------------------------------------------------------------------------------------- | ------ | -------------------------------------------------------------------- | | 6.1.1 | File Read Access | RU+WD | `src/openhuman/tools/impl/filesystem/file_read.rs`, `app/test/e2e/specs/tool-filesystem-flow.spec.ts` (this PR) | ✅ | Was 🟡 — WDIO drives memory_read_file + asserts via Node fs | | 6.1.2 | File Write Access | RU+WD | `src/openhuman/tools/impl/filesystem/file_write.rs`, `app/test/e2e/specs/tool-filesystem-flow.spec.ts` (this PR) | ✅ | Was 🟡 — WDIO drives memory_write_file + asserts bytes match on disk | | 6.1.3 | Path Restriction Enforcement | RU+WD | `src/openhuman/tools/impl/filesystem/file_read.rs`, `app/test/e2e/specs/tool-filesystem-flow.spec.ts` (this PR) | ✅ | Was 🟡 — WDIO asserts traversal + absolute-path denial envelope | ### 6.2 Shell & Git | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ---------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------ | | 6.2.1 | Shell Command Execution | RU+WD | `src/openhuman/tools/impl/system/shell.rs`, `app/test/e2e/specs/tool-shell-git-flow.spec.ts` (this PR) | ✅ | Was 🟡 — WDIO asserts agent runtime + `tools_agent` registry contract; full LLM path tracked #68 | | 6.2.2 | Command Restriction Handling | RU+WD | `src/openhuman/security/policy_tests.rs`, `app/test/e2e/specs/tool-shell-git-flow.spec.ts` (this PR) | ✅ | Was 🟡 — WDIO locks denial envelope shape `{ ok:false, error }` consumed by the React UI | | 6.2.3 | Git Read Operations | RU+WD | `src/openhuman/tools/impl/filesystem/git_operations_tests.rs`, `app/test/e2e/specs/tool-shell-git-flow.spec.ts` (this PR) | ✅ | Was 🟡 — WDIO seeds a fixture repo in OPENHUMAN_WORKSPACE and asserts read ops succeed | | 6.2.4 | Git Write Operations | RU+WD | `src/openhuman/tools/impl/filesystem/git_operations_tests.rs`, `app/test/e2e/specs/tool-shell-git-flow.spec.ts` (this PR) | ✅ | Was 🟡 — WDIO commits into the same fixture and asserts log advances | --- ## 7. Web & Network Capabilities ### 7.1 Browser | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ------------------ | ----- | ------------------------------------------------------------------------------------------------------------------ | ------ | --------------------------------------------------------------------------------------------------- | | 7.1.1 | Open URL | RU+WD | `src/openhuman/tools/impl/browser/browser_open_tests.rs`, `app/test/e2e/specs/tool-browser-flow.spec.ts` (this PR) | ✅ | Was ❌ — WDIO asserts agent runtime + browser-bearing registry; mock backend captures HTTP shape | | 7.1.2 | Browser Automation | RU+WD | `src/openhuman/tools/impl/browser/browser_tests.rs`, `app/test/e2e/specs/tool-browser-flow.spec.ts` (this PR) | ✅ | Was ❌ — WDIO locks tools_agent wildcard scope (exposes the 22-action automation schema to the LLM) | ### 7.2 Network | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | -------------------- | ----- | ----------------------------------- | ------ | ------------------ | | 7.2.1 | HTTP / API Requests | RU+WD | `service-connectivity-flow.spec.ts` | ✅ | | | 7.2.2 | Web Search Execution | WD | `skill-execution-flow.spec.ts` | 🟡 | Generic skill path | | 7.2.3 | TinyFish Integration Tools | RU | `src/openhuman/integrations/tinyfish_tests.rs`, `src/openhuman/tools/ops_tests.rs::all_tools_executes_tinyfish_family_against_fake_backend` | ✅ | Backend-proxied Search, Fetch, and Agent run tools covered with fake backend | --- ## 8. Memory System (Persistent AI Memory) ### 8.1 Memory Operations | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ------------- | ----- | -------------------------------------------------------------------------------------------------- | ------ | ------ | | 8.1.1 | Store Memory | RI+WD | `tests/memory_roundtrip_e2e.rs` (this PR), `app/test/e2e/specs/memory-roundtrip.spec.ts` (this PR) | ✅ | Was ❌ | | 8.1.2 | Recall Memory | RI+WD | same | ✅ | Was ❌ | | 8.1.3 | Forget Memory | RI+WD | same | ✅ | Was ❌ | ### 8.2 Memory Handling | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ------------------ | ----- | ----------------------------------------- | ------ | --------------------------------- | | 8.2.1 | Context Injection | RI | `tests/autocomplete_memory_e2e.rs` | ✅ | | | 8.2.2 | Memory Consistency | RI | `tests/memory_graph_sync_e2e.rs` | ✅ | | | 8.2.3 | Memory Scaling | RU | `src/openhuman/memory/ingestion_tests.rs` | 🟡 | Soak/scale benchmark not asserted | ### 8.3 Memory Retrieval Benchmarks | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ---------------------------------------- | ----- | ---------------------------------------------------------------------------------- | ------ | ----- | | 8.3.1 | Cross-Chat Recall | RU | `src/openhuman/memory/tree/retrieval/benchmarks.rs::bench_cross_chat_recall` | ✅ | Synthetic fixture; verifies relevant source retrieval across chat scopes | | 8.3.2 | Cross-Chat Entity Discoverability | RU | `src/openhuman/memory/tree/retrieval/benchmarks.rs::bench_cross_chat_entity_discoverable` | ✅ | Verifies entity canonicalisation across multiple chats | | 8.3.3 | Citation Bundle Provenance | RU | `src/openhuman/memory/tree/retrieval/benchmarks.rs::bench_citation_bundle_provenance` | ✅ | Verifies source_ref and tree_scope are populated in retrieval hits | | 8.3.4 | Citation Fetch Leaves Hydration | RU | `src/openhuman/memory/tree/retrieval/benchmarks.rs::bench_citation_fetch_leaves_hydrates` | ✅ | Verifies fetch_leaves returns content for exact chunk IDs | | 8.3.5 | Stale Preference Newer Supersedes | RU | `src/openhuman/memory/tree/retrieval/benchmarks.rs::bench_stale_preference_newer_supersedes` | ✅ | Verifies newer explicit correction appears alongside older preference | | 8.3.6 | Contradiction Surfaces Both with Provenance | RU | `src/openhuman/memory/tree/retrieval/benchmarks.rs::bench_contradiction_surfaces_both_with_provenance` | ✅ | Verifies disagreeing sources surface with provenance labels | | 8.3.7 | Long-Source Exact Leaf Retrieval | RU | `src/openhuman/memory/tree/retrieval/benchmarks.rs::bench_long_source_retrieves_exact_leaf` | 🟡 | Embedder required for seal + chunking; test runs in inert mode but assertions are conditional | | 8.3.8 | Drill-Down Isolates Children | RU | `src/openhuman/memory/tree/retrieval/benchmarks.rs::bench_drill_down_isolates_children` | ✅ | Verifies query_topic does not cross scope boundaries | | 8.3.9 | Scale Ingest 20 Sources No Real Data | RU | `src/openhuman/memory/tree/retrieval/benchmarks.rs::bench_scale_ingest_20_sources_no_real_data` | ✅ | Verifies retrieval correctness at scale with synthetic data | --- ## 9. Automation Engine ### 9.1 Task Scheduling | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ------------- | ----- | ------------------------ | ------ | ----- | | 9.1.1 | Task Creation | WD | `cron-jobs-flow.spec.ts` | ✅ | | | 9.1.2 | Task Update | WD | `cron-jobs-flow.spec.ts` | ✅ | | | 9.1.3 | Task Deletion | WD | `cron-jobs-flow.spec.ts` | ✅ | | ### 9.2 Cron Jobs | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | -------------------------- | ----- | ------------------------ | ------ | ----- | | 9.2.1 | Cron Expression Validation | RU | `src/openhuman/cron/` | ✅ | | | 9.2.2 | Recurring Execution | WD+RI | `cron-jobs-flow.spec.ts` | ✅ | | ### 9.3 Remote Execution | ID | Feature | Layer | Test path(s) | Status | Notes | | ----- | ----------------------- | ----- | ------------------------ | ------ | ------------------------ | | 9.3.1 | Remote Agent Scheduling | RI | `tests/json_rpc_e2e.rs` | 🟡 | Coverage thin | | 9.3.2 | Execution Trigger | WD | `cron-jobs-flow.spec.ts` | ✅ | | | 9.3.3 | Retry Handling | RU | `src/openhuman/cron/` | 🟡 | Backoff branches partial | --- ## 10. Unified Messaging Hub ### 10.1 Integration Setup | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | ------------------- | ----- | ---------------------------------------------------- | ------ | ------ | | 10.1.1 | Telegram Connection | WD | `telegram-flow.spec.ts` | ✅ | | | 10.1.2 | WhatsApp Connection | WD | `app/test/e2e/specs/whatsapp-flow.spec.ts` (this PR) | ✅ | Was ❌ | | 10.1.3 | Gmail Connection | WD | `gmail-flow.spec.ts` | ✅ | | | 10.1.4 | Slack Connection | WD | `app/test/e2e/specs/slack-flow.spec.ts` (this PR) | ✅ | Was ❌ | ### 10.2 Authentication & Authorization | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | ------------------------------------- | ----- | --------------------------------------------------------- | ------ | --------------------------------- | | 10.2.1 | OAuth / API Token Handling | WD | `skill-oauth.spec.ts` | ✅ | | | 10.2.2 | Scope Selection (Read/Write/Initiate) | WD | `gmail-flow.spec.ts`, `skill-oauth.spec.ts`, `composio-triggers-flow.spec.ts` | 🟡 | Multi-scope matrix not exhaustive; Gmail trigger OAuth read scope covered | | 10.2.3 | Token Storage & Encryption | RU | `src/openhuman/encryption/`, `src/openhuman/credentials/` | ✅ | | ### 10.3 Message Sync & Ingestion | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | ------------------------- | ----- | ----------------------------------------------------- | ------ | ----- | | 10.3.1 | Incoming Message Sync | RU+WD | `src/openhuman/channels/tests/`, `gmail-flow.spec.ts` | ✅ | | | 10.3.2 | Message Deduplication | RU | `src/openhuman/channels/tests/` | ✅ | | | 10.3.3 | WhatsApp Agent Retrieval | RU | `src/openhuman/tools/impl/whatsapp_data/` (this PR), `tests/json_rpc_e2e.rs::whatsapp_data_agent_tools_e2e_1341` (this PR) | ✅ | Three read-only agent tools wrap the local SQLite store; ingest stays internal-only. See [`docs/whatsapp-data-flow.md`](whatsapp-data-flow.md). | | 10.3.4 | Real-Time vs Delayed Sync | RU | `src/openhuman/channels/tests/runtime_dispatch.rs` | ✅ | | ### 10.4 Messaging Operations | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | --------------------- | ----- | --------------------------------------------- | ------ | ------------------------------------- | | 10.4.1 | Send Message | WD+RI | `gmail-flow.spec.ts`, `telegram-flow.spec.ts` | ✅ | | | 10.4.2 | Reply to Thread | WD | `gmail-flow.spec.ts` | ✅ | | | 10.4.3 | Initiate Conversation | WD | `gmail-flow.spec.ts` | 🟡 | Telegram/WhatsApp/Slack not exercised | | 10.4.4 | Attachment Handling | WD | `gmail-flow.spec.ts` | 🟡 | Attachment branch shallow | ### 10.5 Cross-Channel Behavior | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | ---------------------- | ----- | ------------------------------------------ | ------ | -------------------- | | 10.5.1 | Channel Isolation | RU | `src/openhuman/channels/tests/identity.rs` | ✅ | | | 10.5.2 | Unified Inbox Handling | WD | `channels-smoke.spec.ts` | 🟡 | UI assertion shallow | | 10.5.3 | Context Preservation | RU | `src/openhuman/channels/tests/context.rs` | ✅ | | ### 10.6 Permission Enforcement | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | --------------------------- | ----- | ----------------------------- | ------ | -------- | | 10.6.1 | Read Access Enforcement | RU+WD | `auth-access-control.spec.ts` | ✅ | | | 10.6.2 | Write Access Enforcement | RU+WD | `auth-access-control.spec.ts` | ✅ | | | 10.6.3 | Initiate Action Enforcement | RU | `src/openhuman/channels/` | 🟡 | E2E thin | ### 10.7 Disconnect & Re-Setup | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | ---------------------- | ----- | ------------------------------------------- | ------ | -------------------------------- | | 10.7.1 | Integration Disconnect | WD | `gmail-flow.spec.ts` | ✅ | | | 10.7.2 | Token Revocation | RU | `src/openhuman/credentials/` | ✅ | | | 10.7.3 | Re-Authorization Flow | WD | `skill-oauth.spec.ts` | 🟡 | Re-auth post-revoke not asserted | | 10.7.4 | Permission Re-Sync | WD | _missing_ — tracked #968 | ❌ | | --- ## 11. Intelligence & Insights ### 11.1 Analysis Engine | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | -------------------------- | ----- | ------------------------------------------------------------------------------------------------------------------- | ------ | ----------------------------------------------------------------------------------------- | | 11.1.1 | Multi-Source Analysis | RI | `tests/memory_graph_sync_e2e.rs` | 🟡 | Frontend trigger untested | | 11.1.2 | Actionable Item Extraction | VU | `app/src/components/intelligence/__tests__/utils.test.ts` (this PR) | ✅ | Was ❌ | | 11.1.3 | Analyze Trigger | WD | `app/test/e2e/specs/insights-dashboard.spec.ts` mounts the route (this PR); explicit analyze-handler invocation TBD | 🟡 | Route mounts and search/filter UI assert — full analyze trigger flow tracked as follow-up | | 11.1.4 | MCP stdio server | RU | `src/openhuman/mcp_server/` | ✅ | Read-only initialize/tools/list/tools/call plus stdio framing; binary smoke in PR validation | | 11.1.5 | Global tool registry | RI | `src/openhuman/tool_registry/`, `tests/json_rpc_e2e.rs` | ✅ | Read-only MCP/controller discovery with routes, schemas, version, allowed agents, and health | ### 11.2 Insights Dashboard | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | ------------------ | ----- | -------------------------------------- | ------ | ------ | | 11.2.1 | Memory View | WD | `insights-dashboard.spec.ts` (this PR) | ✅ | Was ❌ | | 11.2.2 | Source Filtering | WD | `insights-dashboard.spec.ts` (this PR) | ✅ | Was ❌ | | 11.2.3 | Search & Retrieval | WD | `insights-dashboard.spec.ts` (this PR) | ✅ | Was ❌ | --- ## 12. Rewards & Progression > Frontend-only domain — no Rust core counterpart. Confirmed during #970 > investigation: there is no `src/openhuman/rewards/` module and no Redux > `rewardsSlice`; snapshot is fetched per-mount via > `app/src/services/api/rewardsApi.ts` and held in `Rewards.tsx` component > state. Backend ownership lives in `tinyhumansai/backend` (`/rewards/me`). ### 12.1 Role Unlocking | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | ------------------------ | ----- | --------------------------------------------------------------------------------------------------------------------- | ------ | -------------------------------------------------------------------- | | 12.1.1 | Activity-Based Unlock | VU+WD | `app/src/store/__tests__/rewardsSlice.test.ts` (this PR), `app/test/e2e/specs/rewards-unlock-flow.spec.ts` (this PR) | ✅ | Was ❌ — streak/feature-driven unlock branch | | 12.1.2 | Integration-Based Unlock | VU+WD | same | ✅ | Was ❌ — Discord membership → role assignment branch | | 12.1.3 | Plan-Based Unlock | VU+WD | same | ✅ | Was ❌ — plan tier + active subscription branch | ### 12.2 Progress Tracking | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | ---------------------- | ----- | ----------------------------------------------------------------------------------------------------------------------------- | ------ | ---------------------------------------------------------------------------------------------------- | | 12.2.1 | Message Count Tracking | VU+WD | `rewardsSlice.test.ts` (this PR), `rewards-progression-persistence.spec.ts` (this PR) | ✅ | Was ❌ — message-driven progress proxied by `metrics.featuresUsedCount` (no literal field) | | 12.2.2 | Usage Metrics | VU+WD | same | ✅ | Was ❌ — current streak + cumulative tokens | | 12.2.3 | State Persistence | VU+WD | same | ✅ | Was ❌ — restart-equivalent (page unmount + remount + re-fetch); admin request log asserts re-fetch | --- ## 13. Settings & Developer Tools ### 13.1 Account & Security | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | ------------------ | ----- | -------------------------------------------------------------------- | ------ | --------------------- | | 13.1.1 | Profile Management | VU | `app/src/components/settings/panels/__tests__/PrivacyPanel.test.tsx` | 🟡 | | | 13.1.2 | Linked Accounts | WD | `auth-access-control.spec.ts` | 🟡 | UI surface unasserted | | 13.1.3 | Meet Handoff Prompt-Injection Guard | VU | `app/src/services/__tests__/webviewAccountService.meetPromptInjection.test.ts` (this PR) | ✅ | Was ❌ — guard blocks handoff on hostile transcripts and wraps non-blocked transcripts in `` delimiters (#1920) | ### 13.2 Automation & Channels | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | --------------------- | ----- | ----------------------------------------------------------- | ------ | ----- | | 13.2.1 | Channel Configuration | WD | `app/test/e2e/specs/settings-channels-permissions.spec.ts` | ✅ | | | 13.2.2 | Permission Settings | WD | `app/test/e2e/specs/settings-channels-permissions.spec.ts` | ✅ | | ### 13.3 AI & Skills | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | ------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------- | ------ | ----------------------------------- | | 13.3.1 | Model Configuration | VU+WD | `app/src/components/settings/panels/__tests__/AutocompletePanel.test.tsx`, `app/test/e2e/specs/settings-ai-skills.spec.ts` | ✅ | AI-model-switch covered | | 13.3.2 | Skill Toggle | WD | `skill-lifecycle.spec.ts`, `app/test/e2e/specs/settings-ai-skills.spec.ts` | ✅ | | ### 13.4 Developer Options | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | ------------------ | ----- | ---------------------------------------------------- | ------ | ----- | | 13.4.1 | Webhook Inspection | WD | `app/test/e2e/specs/settings-dev-options.spec.ts` | ✅ | | | 13.4.2 | Runtime Logs | WD | `app/test/e2e/specs/settings-dev-options.spec.ts` | ✅ | | | 13.4.3 | Memory Debug | WD | `app/test/e2e/specs/settings-dev-options.spec.ts` | ✅ | | ### 13.5 Data Management | ID | Feature | Layer | Test path(s) | Status | Notes | | ------ | ---------------- | ----- | ------------------------------------------------------- | ------ | -------------------------------------- | | 13.5.1 | Clear App Data | WD | `app/test/e2e/specs/settings-data-management.spec.ts` | ✅ | Destructive — confirm-then-reset | | 13.5.2 | Cache Reset | WD | `app/test/e2e/specs/settings-data-management.spec.ts` | ✅ | | | 13.5.3 | Full State Reset | WD | `app/test/e2e/specs/settings-data-management.spec.ts` | ✅ | Restart-and-verify fresh-install state | | 13.5.4 | Migration from another assistant (OpenClaw) | VU+RU | `app/src/components/settings/panels/__tests__/MigrationPanel.test.tsx` (this PR), `src/openhuman/migration/ops.rs` (existing) | ✅ | Was ❌ — UI now wraps the existing `openhuman.migrate_openclaw` RPC with preview-then-apply + confirm. Hermes tracked as follow-up under #1440 (#1440) | --- ## Summary | Status | Count | | ---------------- | ------------------------------------------------ | | ✅ Covered | 66 | | 🟡 Partial | 27 | | ❌ Missing | 26 | | 🚫 Manual smoke | 11 | | **Total leaves** | **131 explicit + nested = 202 product features** | PR-A delta: 13 leaves moved from ❌ → ✅ via 5 WDIO specs + 2 Vitest + 1 Rust integration test. Remaining gaps tracked under sub-issues #965 (process), #966 (docs), #967 (tools), #968 (auth/perm), #969 (settings), #970 (rewards), #971 (manual smoke).