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.
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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) |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 4.3.5 | Image Tool Contracts | RU | src/openhuman/image/ | β
| High-level image_generation / view_image schema, gating, serialization, prompt guidance, and contract e2e coverage for #2984 |
| 4.3.6 | Background Monitor Tools | RU+RI | src/openhuman/monitor/, src/openhuman/tools/ops_tests.rs, tests/json_rpc_e2e.rs | β
| First-class monitor domain covers command denial, line streaming, timeout, stop, bounded output, registry exposure, and JSON-RPC list/read surface for #3371 |
| 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 | β
| |
| 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; inline-gen requires macOS TCC grants β manual only |
| 5.2.2 | Debounce Handling | VU | app/src/features/autocomplete/__tests__/useAutocompleteSkillStatus.test.tsx (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 |
| 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 | β
| Slice validation + persist REHYDRATE, Settings picker UI (#1762), synthesizeSpeech voiceId override propagation |
| ID | Feature | Layer | Test path(s) | Status | Notes |
|---|
| 5.4.1 | Persona Name & Description | VU | app/src/store/personaSlice.test.ts, app/src/components/settings/panels/PersonaPanel.test.tsx | β
| Slice validation + persist REHYDRATE scrub; Settings identity fields persist on save (#2345) |
| 5.4.2 | SOUL.md Edit & Reset | RU+VU | src/openhuman/workspace/rpc.rs, app/src/components/settings/panels/PersonaPanel.test.tsx | β
| Core read/write/reset with allowlist + size cap; panel loads, saves, resets over RPC (#2345) |
| 5.4.3 | Persona Settings Surface | VU | app/src/components/settings/panels/PersonaPanel.test.tsx | β
| Bundles identity + SOUL.md + link to Mascot avatar/voice (#2345) |
| 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 | β
| 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 | β
| 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 | β
| Was π‘ β WDIO asserts traversal + absolute-path denial envelope |
| 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 | β
| 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 | β
| 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 | β
| 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 | β
| Was π‘ β WDIO commits into the same fixture and asserts log advances |
| 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 | β
| 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 | β
| Was β β WDIO locks tools_agent wildcard scope (exposes the 22-action automation schema to the LLM) |
| 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 |
| ID | Feature | Layer | Test path(s) | Status | Notes |
|---|
| 8.1.1 | Store Memory | RI+WD | tests/memory_roundtrip_e2e.rs, app/test/e2e/specs/memory-roundtrip.spec.ts | β
| Was β |
| 8.1.2 | Recall Memory | RI+WD | same | β
| Was β |
| 8.1.3 | Forget Memory | RI+WD | same | β
| Was β |
| 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, tests/worker_c_modules_e2e.rs | β
| Worker C RPC E2E verifies memory-tree ingest is reflected by memory_sync_status_list |
| 8.2.3 | Memory Scaling | RU | src/openhuman/memory/ingestion_tests.rs | π‘ | Soak/scale benchmark not asserted |
| ID | Feature | Layer | Test path(s) | Status | Notes |
|---|
| 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.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.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 |
| ID | Feature | Layer | Test path(s) | Status | Notes |
|---|
| 8.4.1 | Save Preference (general / situational) | RU | src/openhuman/agent/tools/save_preference_tests.rs | β
| save_preference tool β user_pref_{general,situational}, topic-keyed |
| 8.4.2 | Lane A β Standing Prefs in System Prompt | RU | src/openhuman/learning/prompt_sections.rs, src/openhuman/agent/harness/session/turn_tests.rs | β
| General prefs rendered into the system prompt at thread start |
| 8.4.3 | Lane B β Situational Recall (vector-gated) | RU | src/openhuman/memory/store/unified/query_tests.rs::recall_relevant_by_vector_gates_on_similarity | β
| Per-turn; relevant query injects, unrelated suppresses |
| 8.4.4 | Same-Topic Contradiction (replace) | RU | src/openhuman/agent/tools/save_preference_tests.rs::recategorising_moves_pref_between_namespaces | β
| ON CONFLICT REPLACE; a topic lives in exactly one scope |
| 8.4.5 | Cross-Topic Contradiction Surfacing | RU | src/openhuman/agent/tools/save_preference_tests.rs::save_surfaces_related_preference_for_contradiction_check | β
| Related prefs surfaced in the tool result for the chat agent to resolve |
| 8.4.6 | vector_chunks Model-Signature Recall Guard | RU | src/openhuman/memory/store/unified/query_tests.rs::vector_recall_excludes_other_model_signature | β
| Excludes cross-model vectors; dim-guards legacy rows |
| 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 | β
| |
| 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 | β
| |
| 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 |
| 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 | β
| 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 | β
| Was β |
| 10.1.5 | Yuanbao Connection | RU | src/openhuman/channels/providers/yuanbao/, src/openhuman/channels/controllers/ops.rs::tests::connect_yuanbao_*, src/openhuman/channels/runtime/startup.rs::yuanbao_secret_tests | π‘ | New API-key channel for Tencent Yuanbao. RU covers sign-token preflight (valid/invalid creds, env-override cluster routing), credentials store hydration (incl. stale app_key guard), and WS reconnect/shutdown. No WDIO spec yet β connect-flow UI is rendered via the generic ChannelSetupModal already exercised by other channel flow specs. |
| 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/ | β
| |
| 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/whatsapp_data/tools/, tests/json_rpc_e2e.rs::whatsapp_data_agent_tools_e2e_1341 | β
| Three read-only agent tools wrap the local SQLite store; ingest stays internal-only. See docs/whatsapp-data-flow.md. |
| 10.3.4 | Real-Time vs Delayed Sync | RU | src/openhuman/channels/tests/runtime_dispatch.rs | β
| |
| 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 |
| 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+RI | channels-smoke.spec.ts, tests/worker_c_modules_e2e.rs | π‘ | UI assertion shallow; RI covers config-only channel status after connect/disconnect |
| 10.5.3 | Context Preservation | RU | src/openhuman/channels/tests/context.rs | β
| |
| 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 |
| ID | Feature | Layer | Test path(s) | Status | Notes |
|---|
| 10.7.1 | Integration Disconnect | WD+RI | gmail-flow.spec.ts, tests/worker_c_modules_e2e.rs | β
| RI covers channels_disconnect clearing config-only iMessage state |
| 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 | β | |
| 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 | β
| Was β |
| 11.1.3 | Analyze Trigger | WD | app/test/e2e/specs/insights-dashboard.spec.ts mounts the route; explicit analyze-handler invocation TBD | π‘ | Route mounts and search/filter UI assert β full analyze trigger flow tracked as follow-up |
| 11.1.4 | MCP server (stdio + HTTP) | RU | src/openhuman/mcp_server/ | β
| Stdio framing plus Streamable HTTP/SSE session lifecycle; McpHttpClient round-trip tests |
| 11.1.5 | Global tool registry | RI | src/openhuman/tool_registry/, tests/json_rpc_e2e.rs, tests/domain_modules_e2e.rs, tests/worker_b_domain_e2e.rs | β
| Read-only MCP/controller discovery with routes, schemas, version, allowed agents, and health |
| 11.1.6 | SearXNG MCP search | RU | src/openhuman/integrations/searxng.rs, src/openhuman/mcp_server/tools.rs, src/openhuman/tools/schemas.rs | β
| Self-hosted search config, normalized results, MCP argument validation, and mocked HTTP execution |
| 11.1.7 | Bundled prompt resources | RU | src/openhuman/mcp_server/resources.rs, src/openhuman/mcp_server/protocol.rs | β
| resources/list catalog + resources/read happy path, -32002 unknown URI, -32602 missing param, catalog-mirrors-BUILTINS parity test |
| 11.1.8 | Resource templates list | RU | src/openhuman/mcp_server/resources.rs, src/openhuman/mcp_server/protocol.rs | β
| resources/templates/list returns {resourceTemplates: []} (static catalog), tolerates unknown/cursor params |
| 11.1.10 | MCP registry installβconnectβtool_call | RI | tests/json_rpc_e2e.rs (mcp_clients_install_connect_tool_call_happy_path), tests/mcp_registry_e2e.rs, src/openhuman/mcp_registry/setup_ops.rs (#3039) | β
| HTTP-RPC happy path installβconnectβtool_callβupdate_env against test-mcp-stub; transport-aware install (stdio + http_remote) via build_install_transport |
| 11.1.11 | MCP env reconfigure + registry creds | RI/VU | tests/json_rpc_e2e.rs (mcp_clients_registry_settings_roundtrip), src/openhuman/mcp_registry/registries/mcp_official.rs, app/src/components/channels/mcp/InstalledServerDetail.test.tsx (#3039) | β
| update_env persist+reconnect; registry_settings get/set with secrets write-only (config-first, env-fallback); reconfigure form validation |
| 11.1.12 | MCP UI surface + setup-agent client | VU | app/src/components/channels/mcp/InstallDialog.test.tsx, app/src/services/api/mcpClientsApi.test.ts, app/src/services/api/mcpSetupApi.test.ts (#3039) | β
| Skills ?tab=mcp renders McpServersTab (not Coming Soon); auto-connect on install (best-effort); typed mcpSetupApi wrapper |
| ID | Feature | Layer | Test path(s) | Status | Notes |
|---|
| 11.2.1 | Memory View | WD | insights-dashboard.spec.ts | β
| Was β |
| 11.2.2 | Source Filtering | WD | insights-dashboard.spec.ts | β
| Was β |
| 11.2.3 | Search & Retrieval | WD | insights-dashboard.spec.ts | β
| Was β |
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).
| ID | Feature | Layer | Test path(s) | Status | Notes |
|---|
| 12.1.1 | Activity-Based Unlock | VU+WD | app/src/store/__tests__/rewardsSlice.test.ts, app/test/e2e/specs/rewards-unlock-flow.spec.ts | β
| 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 |
| ID | Feature | Layer | Test path(s) | Status | Notes |
|---|
| 12.2.1 | Message Count Tracking | VU+WD | rewardsSlice.test.ts, rewards-progression-persistence.spec.ts | β
| 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 |
| 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 | β
| Was β β guard blocks handoff on hostile transcripts and wraps non-blocked transcripts in <meeting_transcript source="untrusted_external_audio"> delimiters (#1920) |
| 13.1.4 | Wallet Balances Panel | VU | app/src/components/settings/panels/__tests__/WalletBalancesPanel.test.tsx, app/src/services/walletApi.test.ts | β
| Loading/error/empty/loaded states; Retry + Refresh re-invocation; chain badges; truncated address; providerStatus chip |
| 13.1.5 | Approval History | VU | app/src/components/settings/panels/__tests__/ApprovalHistoryPanel.test.tsx, app/src/services/api/approvalApi.test.ts | β
| Was β β read-only audit surface over approval_list_recent_decisions; covers loaded/empty/error/refresh states, per-decision badge, and the bare-array vs {result,logs} envelope normalization |
| 13.1.6 | Action Timeout | VU, RU, RI | app/src/components/settings/panels/__tests__/AgentAccessPanel.test.tsx, src/openhuman/tool_timeout/mod.rs, src/openhuman/config/ops_tests.rs, tests/json_rpc_e2e.rs | β
| New (#3100) β UI control over config_get/update_agent_settings for [agent].agent_timeout_secs; covers load/persist-on-blur/range-rejection/no-op/env-override-disable, the runtime-mutable tool_timeout resolver + env precedence, ops apply/reject, and the RPC roundtrip |
| 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 | β
| |
| 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 | β
| |
| 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 | β
| |
| 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, 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 |
| Status | Count |
|---|
| β
Covered | 70 |
| π‘ Partial | 27 |
| β Missing | 26 |
| π« Manual smoke | 11 |
| Total leaves | 135 explicit + nested = 206 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).