Files
openhuman/docs/TEST-COVERAGE-MATRIX.md
T

133 KiB

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.2.5 First-Run Harness Init (Python/spaCy/Node) RU+RI+VU src/openhuman/harness_init/* (#[cfg(test)]), src/openhuman/runtime_python/downloader_tests.rs, tests/json_rpc_e2e.rs, app/src/services/harnessInitService.test.ts, app/src/components/InitProgressScreen/InitProgressScreen.test.tsx Eager startup provisioning + harness_init_status/_run RPC + blocking init overlay; managed CPython pinned to 3.13.x. Live download/model fetch is MS (network)

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 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, tests/agent_harness_e2e.rs tests/agent_harness_e2e.rs adds provider-level SSE tool-arg accumulation (chunked args reassembled + parsed) and engine-level delta forwarding (#3471)
4.2.4 Parallel inference (cross-thread + within-thread forked turns) RU+VU src/openhuman/web_chat/web_tests.rs, app/src/store/__tests__/chatRuntimeSlice.test.ts, app/src/providers/__tests__/ChatRuntimeProvider.test.tsx 🟡 Concurrent same-/cross-thread dispatch, cooperative CancellationToken teardown, and parallel-lane stream routing covered; dedicated WD E2E is a follow-up
4.2.5 Per-thread todo list (plan strip above composer) RU+VU+WD src/openhuman/agent/tools/todo.rs, app/src/pages/conversations/components/ThreadTodoStrip.test.tsx, app/test/e2e/specs/chat-thread-todo-strip.spec.ts Read-only thread-scoped todo strip fed by task_board_updated; agent todo tool guidance + thread binding; E2E drives a todo tool call and asserts the card renders
4.2.6 Background-activity panel (chat-header Background tasks button) VU+WD app/src/pages/conversations/hooks/useBackgroundActivity.test.ts, app/src/pages/conversations/components/__tests__/BackgroundActivityRows.test.tsx, app/test/e2e/specs/chat-background-activity-panel.spec.ts View-only panel surfacing this chat's async sub-agents + global cron jobs, subconscious/heartbeat status, and memory syncing; freshness-only "Syncing now" labeling; E2E opens the panel and asserts its sections render and close
4.2.7 Plan-mode review (Approve / Reject / Send-feedback before execute) RU+RI+VU src/openhuman/plan_review/gate.rs, src/openhuman/plan_review/tool.rs, src/openhuman/plan_review/schemas.rs, tests/json_rpc_e2e.rs, app/src/pages/conversations/components/PlanReviewCard.test.tsx, app/src/pages/__tests__/Conversations.render.test.tsx Interactive turns call request_plan_review, which parks the LIVE turn on the in-memory PlanReviewGate (oneshot) until the user decides; plan_review_request socket event drives PlanReviewCard, which resolves via openhuman.plan_review_decide (approve resumes-and-executes / reject resumes-and-stops / revise resumes-with-feedback). RU covers gate park/resolve/timeout + tool auto-approve + parking; RI covers the decide RPC; VU covers the card + provider wiring. WD E2E (agent-driven park flow) tracked as follow-up

| 4.2.8 | Composer attachments (image / video / document; drag-drop + paste) | VU | app/src/lib/attachments.test.ts, app/src/components/chat/__tests__/ChatComposer.test.tsx, app/src/pages/__tests__/Conversations.attachments.test.tsx | 🟡 | Attach affordance gated on the resolved vision tier (images/video need vision; documents flow on any model); video is sampled into still frames client-side and forwarded through the existing [IMAGE:] vision path; drag-drop + clipboard-paste reuse the picker ingest. VU covers MIME/kind/limits/marker building + drag-drop + paste; real video decode and the frames→vision round-trip are manual-smoke only (jsdom has no video codec). WD E2E is a follow-up |

| 4.2.9 | Share cards ("Look what my agent did" post to X / LinkedIn) | VU | app/src/features/share/shareContent.test.ts, app/src/features/share/shareTargets.test.ts, app/src/features/share/shareCaption.test.ts, app/src/features/share/shareCard.test.ts, app/src/features/share/ShareMessageButton.test.tsx, app/src/features/share/ShareCardModal.test.tsx | | Hover Share button under completed agent messages opens a Canvas 2D branded card; LLM-drafted headline/caption via inference_agent_chat_simple with deterministic offline fallback; X/LinkedIn intent URLs + copy/save PNG; secrets/paths/emails redacted before render. MVP wires only the completed-task trigger; workflow-run + Human-tab triggers are follow-ups. WD E2E deferred |

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
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
4.3.7 Mascot Avatar Animation VU app/src/features/human/Mascot/RiveMascot.test.tsx, app/src/features/human/Mascot/riveMaps.test.ts Rive MascotSM state machine: face→pose mapping, Oculus→visme_codes viseme normalization, and idle random pose rotation for the tiny_mascot.riv upgrade

4.4 Agent Harness Behaviors

End-to-end coverage of the agent harness via the web-chat RPC surface against an in-test scripted upstream (tests/agent_harness_e2e.rs) plus browser-level Redux/DOM assertions (app/test/e2e/specs/agent-harness-behaviors.spec.ts). Added for #3471.

ID Feature Layer Test path(s) Status Notes
4.4.1 Subagent Delegation RI+WD tests/agent_harness_e2e.rs, app/test/e2e/specs/agent-harness-behaviors.spec.ts Orchestrator→researcher delegation asserts ≥3 upstream calls, distinct researcher persona, no "Unknown tool:"
4.4.2 Subagent Clarification (input-required) RI+WD tests/agent_harness_e2e.rs, app/test/e2e/specs/agent-harness-behaviors.spec.ts, chat-harness-subagent-continue.spec.ts Subagent question surfaced + reply completes turn; full continue_subagent resume covered by the continue spec
4.4.3 Approval Gate — Approve RI+WD tests/agent_harness_e2e.rs, app/test/e2e/specs/agent-harness-behaviors.spec.ts approval_request event → approve → tool executes (timeline success, file written)
4.4.4 Approval Gate — Deny RI+WD tests/agent_harness_e2e.rs, app/test/e2e/specs/agent-harness-behaviors.spec.ts Deny → tool not executed (timeline error, file unchanged), agent explains gracefully
4.4.5 Approval Gate — TTL Timeout RI tests/agent_harness_e2e.rs OPENHUMAN_APPROVAL_TTL_SECS (debug-only) → no decision → auto-deny
4.4.6 Subagent + Approval Gate RI tests/agent_harness_e2e.rs Approval fires inside subagent context; decision propagates; artifact content asserted
4.4.7 Multi-turn State Persistence RI tests/agent_harness_e2e.rs Turn-2 upstream request carries turn-1 user + assistant messages
4.4.8 Parallel Subagent Fan-out RI tests/agent_harness_e2e.rs spawn_parallel_agents 2-task fan-out; both child results reach synthesis call
4.4.9 Max Iterations / Empty Response RI tests/agent_harness_e2e.rs Tool-call limit surface + empty-completion graceful terminal (both skip Sentry)
4.4.10 Provider Error Retry RI tests/agent_harness_e2e.rs First upstream 500 retried by ReliableProvider; second succeeds
4.4.11 Inference Phase Transitions WD app/test/e2e/specs/agent-harness-behaviors.spec.ts Redux inferenceStatusByThread observes subagent phase then clears to idle
4.4.12 Tool Timeline Completeness WD app/test/e2e/specs/agent-harness-behaviors.spec.ts Timeline entries carry id/name/status/round; subagent row reaches success; rounds non-decreasing

5. Built-in Intelligence Skills

5.1 Voice Intelligence

ID Feature Layer Test path(s) Status Notes
5.1.1 Voice Input Capture WD voice-mode.spec.ts
5.1.2 Speech-to-Text Processing WD voice-mode.spec.ts
5.1.3 Voice Command Execution WD voice-mode.spec.ts
5.1.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

5.2 Persona

ID Feature Layer Test path(s) Status Notes
5.2.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.2.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.2.3 Persona Settings Surface VU app/src/components/settings/panels/PersonaPanel.test.tsx Bundles identity + SOUL.md + link to Mascot avatar/voice (#2345)

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 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

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 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

6.3 Sub-agent Orchestration

ID Feature Layer Test path(s) Status Notes
6.3.1 Steer a running sub-agent RU src/openhuman/agent_orchestration/running_subagents.rs, src/openhuman/agent_orchestration/tools/steer_subagent.rs steer_subagent injects a steer/collect message into a running async sub-agent's run-queue; registry enforces parent ownership + terminal guard.
6.3.2 Wait for a sub-agent result RU src/openhuman/agent_orchestration/running_subagents.rs, src/openhuman/agent_orchestration/tools/wait_subagent.rs wait_subagent blocks on the completion watch with a timeout; prunes terminal entries, leaves entries intact on timeout.
6.3.3 Steer lands in child history RU src/openhuman/agent/harness/subagent_runner/ops_tests.rs::run_queue_steer_lands_in_subagent_history End-to-end: a queued steer is drained by the child run_turn_engine and appears as a [User steering message] user turn in the provider request.
6.3.4 Subconscious trigger pipeline (normalize → dedupe/rate → gate → queue) RU+RI src/openhuman/subconscious_triggers/, tests/subconscious_triggers_e2e.rs Event→Trigger normalization for cron/user/composio/sub-agent, dedupe TTL + per-source rate limit, LLM gate over agent::triage, priority queue with overflow eviction.
6.3.5 Long-lived subconscious orchestrator session RU src/openhuman/subconscious/session.rs, src/openhuman/subconscious/user_thread.rs Persistent compressed session backed by a reserved thread; notify_user handoff to the user-facing thread; mode→autonomy config parity.
6.3.6 Multi-party human↔subconscious↔sub-agent conversation RI tests/subconscious_conversation_e2e.rs Scripted Gate/SessionExecutor seam drives delegate→sub-agent→merge, failure/retry, interleaving, dedupe, and rate-limit scenarios through the real orchestrator.
6.3.7 Full-stack trigger pipeline with mocked LLM RI tests/subconscious_fullstack_e2e.rs (feature e2e-test-support) Real GatePass+LongLivedSession+Agent+sub-agent run against a provider-layer mock (no network); promote/drop, persistence, real spawn_subagent.
6.3.8 Subconscious Triggers debug/manage panel (Brain) WD app/test/playwright/specs/subconscious-triggers.spec.ts Brain→Subconscious panel: renders disabled baseline + hint + reserved thread ids; enable toggle → Pipeline Enabled + event_driven + orchestrator running; disable; refresh re-fetches.
6.3.9 Vision sub-agent reads attached images RU src/openhuman/agent_registry/agents/loader.rs::vision_agent_loads_on_vision_hint, src/openhuman/inference/provider/factory_tests.rs::vision_tier_is_vision_capable, src/openhuman/agent/harness/engine/core.rs::gate_tests, src/openhuman/agent/multimodal_tests.rs::extract_image_placeholders_pulls_att_tokens_in_order Orchestrator (non-vision chat-v1) keeps the image as a placeholder, delegates to vision_agent on the vision-v1 tier, which rehydrates the on-disk attachment and reads it. Engine gate prefers per-tier current_model_vision; turn placeholders forwarded into the sub-agent prompt.
6.3.10 Auto-accept contact requests from linked agents RU src/openhuman/agent_orchestration/pairing.rs::{auto_accept_gate_accepts_linked_but_leaves_others_pending,auto_accept_gate_unifies_base58_and_base64_of_same_key,auto_accept_gate_accepts_nothing_with_empty_linked_set,auto_accept_fails_closed_on_unreadable_pairing_store,incoming_pending_requesters_filters_and_resolves_requester} On an inbound tiny.place contact_request, OpenHuman auto-accepts iff the requester is in linked_agent_ids() (its own paired agents) and otherwise leaves it pending for the human — the e2e gate that stops the relay dropping a linked agent's session_info intro. Fail-closed: a pairing-store read error yields an empty linked set → nothing auto-accepted. base58/base64 encodings of the same key unify via the shared DM-ingest matcher.

| 6.3.11 | Async-by-default archetype delegation (durable ref) | RU | src/openhuman/agent_orchestration/tools/tools_e2e_tests.rs::archetype_delegation_defaults_to_async_with_durable_session_e2e, src/openhuman/agent_orchestration/tools/archetype_delegation.rs::parameters_schema_advertises_async_default_blocking_opt_in | | delegate_* / build_workflow with a parent turn + chat thread return [async_subagent_ref] (task_id + subagent_session_id) immediately, persist a durable reusable session, and queue the result for background delivery as a new turn; blocking: true opts back into inline dispatch, and no-thread contexts fall back automatically. | | 6.3.12 | Cross-turn sub-agent roster (durable store merge) | RU | src/openhuman/agent_orchestration/running_subagents.rs::snapshot_and_block_scope_to_parent_and_reflect_live_status | | [active_subagents] merges the in-memory registry with the per-workspace subagent_sessions store, so a cold-booted parent still sees earlier workers (id, status, task title) and resumes instead of re-delegating; Closed sessions excluded, other parents' sessions never leak. | | 6.3.13 | continue_subagent durable resume (no pause checkpoint) | RU | src/openhuman/agent_orchestration/tools/tools_e2e_tests.rs::{continue_subagent_resumes_idle_durable_session_e2e,continue_subagent_without_checkpoint_or_durable_session_names_the_roster} | | With no ask_user_clarification checkpoint, continue_subagent resolves the durable session by subagent_session_id / task id, resumes it via the reusable async path seeded with persisted history, and keeps the same durable id; missing sessions error with a pointer at the roster. | | 6.3.14 | Workflow proposal durability (async builder → chat card) | RU+VU | src/openhuman/agent_orchestration/tools/spawn_async_subagent.rs::{extract_workflow_proposal_finds_last_proposal_tool_result,attach_workflow_proposal_persists_thread_message_and_extends_summary,attach_workflow_proposal_without_proposal_returns_summary_unchanged}, app/src/lib/workflows/workflowProposal.test.ts | | A workflow_proposal payload in a finished async child's history is persisted as a parent-thread message (metadata scope workflow_proposal) and embedded in the delivery notice; the frontend rehydrates the newest unconsumed proposal into the card on thread load, and Save/Dismiss mark the source message consumed. |

6.4 Managed Cloud File Storage

ID Feature Layer Test path(s) Status Notes
6.4.1 storage_upload_file (multipart, quota/TTL args, path safety) RU src/openhuman/file_storage/tools_tests.rs wiremock upload against the backend envelope; rejects workspace-escaping/symlinked paths, bad visibility/ttl; surfaces backend errors (e.g. insufficient balance).
6.4.2 storage_download_file (redirect follow + persist to workspace) RU src/openhuman/file_storage/tools_tests.rs Follows the 302 to the presigned URL, persists bytes under the action dir, honors explicit filename.
6.4.3 storage_list_files / storage_get_link RU src/openhuman/file_storage/tools_tests.rs List + usage rendering; presigned link generation with expiry arg validation.
6.4.4 storage_set_visibility / storage_delete_file RU src/openhuman/file_storage/tools_tests.rs Public/private toggle surfaces the stable public URL; delete confirms backend deleted flag; both are Write-level tools with external effect.

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 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)

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
7.2.4 Exa BYOK search (direct API) RU+RI+VU src/openhuman/search/tools/exa_tests.rs, src/openhuman/search/registry.rs, src/openhuman/config/schema/tools/search.rs, tests/config_auth_app_state_connectivity_e2e.rs, app/src/components/settings/panels/SearchPanel.test.tsx (#5137) exa_search / exa_find_similar / exa_get_contents post straight to api.exa.ai against a local stand-in; missing and 401 keys give distinct errors without echoing the response body; keyless Exa falls back to managed; key round-trips through the config RPC, secret encryption, and env overlay; panel asserts the needs-key badge and the exa.ai key link

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, 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

8.2 Memory Handling

ID Feature Layer Test path(s) Status Notes
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
8.2.4 Raw-archive sync reconcile RU+RI src/openhuman/memory_sync/sources/rebuild.rs, src/openhuman/memory_sync/workspace/periodic.rs, tests/json_rpc_e2e.rs (json_rpc_memory_sources_reconcile_reports_pending_raw_files), tests/memory_sync_pipeline_e2e.rs Coverage gate + incremental rebuild + workspace periodic scheduler + memory_sources_reconcile RPC
8.2.5 Coding-session persona ingestion RU+RI+VU+WD src/openhuman/tinycortex/persona.rs, tests/coding_sessions_feature.rs, tests/json_rpc_e2e.rs, app/src/components/intelligence/__tests__/CodingSessionsCard.test.tsx, app/src/services/memorySourcesService.test.ts, app/test/e2e/specs/coding-session-memory.spec.ts, app/test/playwright/specs/coding-session-memory.spec.ts Discovers Codex and Claude Code histories, excludes machine-authored turns, exposes status/ingest RPCs, and surfaces incremental ingestion on Brain > Sources

8.3 Memory Retrieval Benchmarks

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

8.4 Explicit User Preferences (Two-Lane)

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/namespace_store/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/namespace_store/query_tests.rs::vector_recall_excludes_other_model_signature Excludes cross-model vectors; dim-guards legacy rows

8.5 Long-term Goals

ID Feature Test Source / Test File Status Notes
8.5.1 Goals CRUD (list/add/edit/delete) RU+VU src/openhuman/memory_goals/store.rs, src/openhuman/memory_goals/ops.rs, src/openhuman/memory_goals/tools.rs, app/src/services/api/goalsApi.test.ts, app/src/components/intelligence/GoalsPanel.test.tsx Editable MEMORY_GOALS.md list over memory_goals_* RPC + Brain > Goals UI
8.5.2 Goals enrichment (reflect) RU+VU src/openhuman/memory_goals/enrich.rs, src/openhuman/memory_goals/schemas.rs, app/src/components/intelligence/GoalsPanel.test.tsx 🟡 Turn-based goals_agent enrichment; prompt/registry/error paths unit-tested, live LLM run manual

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

9.4 Workflow Run History

ID Feature Layer Test path(s) Status Notes
9.4.1 Aggregate run history (all workflows) RU+VU src/openhuman/flows/ops_tests.rs::flows_list_all_runs_aggregates_across_flows_newest_first, app/src/pages/WorkflowRunsPage.test.tsx New openhuman.flows_list_all_runs RPC (store::list_all_flow_runs) backs the Workflows page "Workflow Runs" sub-view. RU asserts cross-flow, newest-first aggregation; VU asserts the list/empty/error render.

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 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.
10.1.6 Email (IMAP/SMTP) Connection RU+VU src/openhuman/channels/controllers/definitions_tests.rs::email_*, src/openhuman/channels/controllers/ops/connect.rs::email_config_tests, src/openhuman/channels/controllers/ops_tests.rs::{persist_email_config_*,disconnect_email_*,connect_email_rejects_invalid_port_*,test_channel_email_rejects_invalid_port_*}, app/src/components/channels/CredentialChannelConfig.test.tsx, app/src/components/channels/ChannelConfigPanel.test.tsx 🟡 #4280 — native IMAP/SMTP for non-Gmail/Outlook mailboxes surfacing the existing EmailChannel. RU covers credentials→EmailConfig mapping/defaults, port/sender parsing, definition/validation, config persist + disconnect, and pre-network invalid-port rejection. VU covers the connect form rendering/submit + panel routing. Live IMAP verify + WDIO connect-flow are follow-ups.

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/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 src/openhuman/whatsapp_data/README.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+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

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+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

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 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, app/test/playwright/specs/mcp-tab-flow.spec.ts (#3039, #4272) HTTP-RPC happy path install→connect→tool_call→update_env against test-mcp-stub; transport-aware install (stdio + http_remote) via build_install_transport; UI-level Playwright flow drives browse→install→connect→run-tool (#4272)
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/RU app/src/components/channels/mcp/InstallDialog.test.tsx, app/src/components/channels/mcp/McpServersTab.test.tsx, app/src/services/api/mcpClientsApi.test.ts, app/src/services/api/mcpSetupApi.test.ts, src/openhuman/mcp_registry/{curation,registry,registries/mcp_official}.rs (#3039, #4272) Skills ?tab=mcp renders McpServersTab (not Coming Soon); auto-connect on install (best-effort); typed mcpSetupApi wrapper; curated "perfect server" catalog (declared website + named credential) with official-vendor badge + official-first order; namespace-stripped relevance search + server-side Stdio/Hosted transport filter; clickable Website/Repo links; wired connection health toolbar (Retry all / Disconnect all) (#4272)
11.1.13 MCP HTTP-remote auth (token / Bearer / OAuth) + redirect resolution RU/VU src/openhuman/mcp_registry/connections.rs (build_http_auth*, resolve_final_url), src/openhuman/mcp_registry/oauth.rs (PKCE/token/bundle/callback port), app/src/components/channels/mcp/ConnectAuthModal.test.tsx (#3495) Bearer/raw scheme + custom headers; redirect-final-URL resolved before auth; OAuth dynamic client registration + PKCE + refresh; tokens MERGED into stored env; credentials stored encrypted locally, never sent to backend
11.1.14 MCP "Help & configure" assistant VU/RU app/src/components/channels/mcp/ConfigAssistantPanel.test.tsx, app/src/components/channels/mcp/ConfigHelpModal.test.tsx, src/openhuman/mcp_registry/ops.rs (invoke_config_assist_agent) (#3495) Server-specific prompt offered as a one-click "Get step-by-step setup help" action (on-demand, no longer auto-run on open — #4272), running an agentic turn scoped to web_search_tool/web_fetch/curl only; markdown-rendered reply; per-MCP chat persisted while on the detail page
11.1.15 Agent uses connected MCP servers in chat RU src/openhuman/agent_registry/agents/loader.rs (orchestrator_subagents_include_mcp_agent, mcp_agent_drives_connected_servers_without_install_or_shell, planner_has_readonly_mcp_discovery_not_execute), src/openhuman/agent_registry/agents/orchestrator/prompt.rs (connected_mcp_block_*), src/openhuman/agent/harness/session/turn_tests.rs (mcp_announcement_fires_once_for_new_server), src/openhuman/mcp_registry/{tools,connections}.rs (#3495) use_mcp_server delegate → mcp_agent worker (discover→list→call); mcp_registry_list_tools read-only discovery; orchestrator ## Connected MCP Servers prompt block + mid-session connect announcement on the user turn; planner read-only MCP discovery (no tool_call)

11.2 Insights Dashboard

ID Feature Layer Test path(s) Status Notes
11.2.1 Memory View WD insights-dashboard.spec.ts Was
11.2.2 Memory Graph Controls WD insights-dashboard.spec.ts Brain Graph tab actions toolbar
11.2.3 Memory Graph Surface WD insights-dashboard.spec.ts Populated SVG or empty-state graph surface

11.3 Hosted Orchestration

ID Feature Layer Test path(s) Status Notes
11.3.1 Hosted-only orchestration (client = trigger + effects + render) RI+VU tests/orchestration_hosted_client.rs, app/src/components/intelligence/TinyPlaceOrchestrationTab.test.tsx, app/src/components/orchestration/__tests__/AgentChatPanel.test.tsx Local wake-graph brain retired (frontend_agent/graph/master_agent/reasoning_agent deleted). Client forwards events to the hosted brain (POST /orchestration/v1/events), uploads world-diffs, syncs hosted sessions/messages/steering into the render cache, and executes send_dm/evict socket effects; cloud-unreachable banner on outage.
11.3.2 Direct paid Medulla orchestration with local OpenHuman tools RU src/openhuman/orchestration/medulla.rs, src/openhuman/orchestration/schemas.rs openhuman.orchestration_run checks the active paid plan, starts a hosted Medulla cycle, executes requested contact/session/send tools locally, and continues pending/tool-use events to a final result. Mocked HTTP tests cover direct and tool-loop success plus plan, pending, backend-error, unknown-tool, and tool-failure paths.
11.3.3 Local medulla-serve supervision (medulla_local RPC, Flavor A draft) RU+RI src/openhuman/medulla_local/server_tests.rs, tests/medulla_local_e2e.rs Behind the default-ON medulla-local feature. Unit tests drive the supervisor's handshake seam against a mock connector: restart-and-retry fires only on mid-request transport death of an idempotent op (exactly one respawn); the non-idempotent instruct is never replayed — a transport break surfaces the typed MaybeApplied error with no duplicate submission; an overall per-request deadline (subconscious.medulla_local.request_deadline_secs, default 300s) bounds a request even while the child keeps streaming frames or while a serve→host port callback (inference.invoke/tools.invoke) hangs on a stalled provider/tool — tripping as the typed transport error (MaybeApplied for instruct, restart-and-retry-once for status); a retry that also breaks mid-request resets the replacement connection, so the next request re-establishes cleanly instead of reusing a poisoned transport; child liveness is probed before the cached connection is trusted, so a child that dies between requests reports running=false and is respawned on the next request instead of misreporting MaybeApplied; ok=false serve rejections fail fast with the typed RequestError without killing the child; and the global cache is keyed on an order-canonical config fingerprint (map-field insertion order cannot invalidate it, a changed config rebuilds and bypasses the start-failure backoff). The transport is unix-only; non-unix targets compile a stub whose entry points report a typed unsupported-platform error (self-tested on those targets). The RI suite boots the real JSON-RPC router and asserts medulla_local.status returns a well-formed idle snapshot (running=false, actionable message) and instruct fails cleanly when no serve entry is configured — hermetic, no Node child or network.

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, 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

12.2 Progress Tracking

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

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 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

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, 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

13.6 Keyboard Shortcuts & Command Surface

ID Feature Layer Test path(s) Status Notes
13.6.1 Command Palette (⌘K / ⌘P) VU+WD app/src/lib/commands/__tests__/globalActions.test.tsx, app/src/components/commands/__tests__/CommandProvider.test.tsx, app/test/e2e/specs/command-palette.spec.ts Opens via ⌘K, runs an action, lists seed nav actions, Esc closes
13.6.2 Keyboard Shortcuts help directory (? / ⌘/) VU+WD app/src/components/shortcuts/__tests__/shortcutsView.test.tsx, app/src/components/commands/__tests__/CommandProvider.test.tsx, app/test/e2e/specs/command-palette.spec.ts Registry-driven grouped list; opens via ? and ⌘/ (mutually exclusive with palette); also reachable from the sidebar shortcut icon + Settings → Keyboard Shortcuts
13.6.3 Global shortcut map (nav / chat / view / profiles) VU app/src/lib/commands/__tests__/globalActions.test.tsx Control-based nav (ctrl/mod per-OS), New Chat / Toggle Sidebar handlers, alias keys, and wired-but-hidden profile switches

14. Tabbed Terminal UI (openhuman / openhuman tui)

14.1 TUI Subcommand (feature-gated tui)

ID Feature Layer Test path(s) Status Notes
14.1.1 Transcript reducer (deltas, done, error, tools) RU src/tui/state.rs Pure TranscriptState::apply_event — client-id filtering, text/thinking split, chat_done finalization
14.1.2 Runner flags + thread resolution + RPC name pins RU src/tui/runner.rs, src/tui/app.rs --thread/--new parsing; canonical openhuman.* method names resolve via registry
14.1.3 Tab order + render layout + persistent footer RU src/tui/ui_state.rs, src/tui/render.rs Logs-first tab state and ratatui TestBackend
14.1.4 Disabled-build diagnostic (--no-default-features) RU src/core/cli_tests.rs (tui/chat *_reports_disabled_build_when_gate_off) Build-fact error, not unknown namespace
14.1.5 Bare-command launch policy RU src/core/cli_tests.rs TTY + CLI auto-launch; Docker, pipes, feature-off, and explicit commands stay headless
14.1.6 Bounded live core-log buffer RU src/core/logging.rs Preserves ordering; bounds both line count and individual line length
14.1.7 Interactive terminal session (raw mode, streaming) MS manual PTY smoke 🚫 Requires a real PTY to verify key input and terminal restoration

15. Agent Profile Homes (multi-agent profiles)

15.1 Profile Homes & Isolation

ID Feature Layer Test path(s) Status Notes
15.1.1 Profile home materialization + file-backed SOUL.md RU src/openhuman/profiles/home.rs, src/openhuman/profiles/paths.rs Idempotent atomic seeds, id validation matrix, soul resolution order incl. legacy-id skip
15.1.2 Dedicated memory suffix + dedicated workspace descriptor RU src/openhuman/profiles/paths.rs, src/openhuman/agent/harness/session/builder/factory.rs effective_memory_suffix matrix; real derive_profile_workspace_descriptor seam, None path unchanged
15.1.3 Cross-profile write guard (file tools + shell) RU src/openhuman/profiles/guard.rs, src/openhuman/security/policy/policy_tests.rs Block sibling / allow own / disarmed-allows; traversal + symlink cases through real validate_parent_path
15.1.4 Profile-scoped agent experience (capture stamp + partition) RU src/openhuman/agent_experience/ (capture/store/ops tests) Profiled query sees own + legacy, excludes siblings; profile-less sees all
15.1.5 Per-profile skills dir (discover/describe/read/run precedence) RU src/openhuman/skills/registry.rs, src/openhuman/skills/ops_discover.rs Owner-only visibility; profile-local wins collisions; global-only resolves everywhere
15.1.6 Cron profile attribution (schema, patch clearing, fallback) RU/RI src/openhuman/cron/types.rs, src/openhuman/cron/store.rs, tests/json_rpc_e2e.rs Double-option wire semantics (absent/null/value); deleted-profile fallback; e2e round-trip incl. null clearing
15.1.7 Profiles RPC lifecycle (dedicated memory, enriched paths) RI tests/json_rpc_e2e.rs (json_rpc_profiles_dedicated_memory_lifecycle) Upsert → list shows dedicatedMemory + enriched soulMdFile/workspaceDir/skillsDir
15.1.8 Profile editor isolation UI (toggles, path rows) VU app/src/components/settings/panels/ProfileEditorPage.test.tsx Default-off render, dispatch payload, hydration, path rows shown/hidden
15.1.9 Cron profile picker UI (assign, clear, deleted fallback) VU app/src/components/settings/panels/cron/ tests, app/src/services/api/agentProfilesApi.test.ts Create with/without id, edit prefill, clear→null, deleted-profile preserved, list label fallback

Summary

Status Count
Covered 79
🟡 Partial 27
Missing 26
🚫 Manual smoke 11
Total leaves 143 explicit + nested = 214 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).