This directory is the canonical test specification for Helmryth 0.1.0. It covers the desktop renderer, local harness, Electron shell, Workbenches, voice lines, Helmryth Mobile, Android control, iOS, Registry, Conduit, MCP, security boundaries, packaging, and release delivery.
The plan distinguishes what can be proven automatically in this repository from what requires a signed package, real provider account, physical device, operating-system permission, cloud binding, or owner-controlled release destination. A blocked external case is not silently treated as passed.
A release candidate is eligible for sign-off only when all of the following are true:
- Every discovered screen, route, control, IPC channel, cloud endpoint, workflow, and package command maps to at least one stable test ID.
- Every P0 and P1 case is either passing with retained evidence or explicitly blocked by a named external prerequisite and accepted by the release owner.
- Automated suites pass from a clean dependency install, and every rerun caused by a flaky infrastructure failure is recorded rather than hidden.
- No active product route or control lacks keyboard, focus, accessible-name/state, error, loading, empty, success, and responsive assertions where those states apply.
- Consequential actions prove Gate wording, scope, denial, cancellation, persistence, audit trail, and fail-closed behavior.
- Secrets, tokens, workstream content, file paths, and provider credentials prove redaction and least-privilege boundaries.
- Packaging proves product identity, artifact names, architecture, update target, signatures when provisioned, checksums, clean install, upgrade, uninstall, and rollback.
- Public documentation, help copy, accessible names, diagnostics, notifications, logs, and release metadata use the Helmryth vocabulary.
- The execution report names the exact source revision or archive hash, environment, commands, timestamps, counts, failures, reruns, screenshots, traces, and remaining risk.
All domain documents follow TEST-CASE-TEMPLATE.md. Required fields include prerequisites, exact actions, visible and persisted outputs, negative and race cases, accessibility, security/privacy, cleanup, automation mapping, evidence, priority, platform, and execution status.
| Document | Primary ownership | Required surface |
|---|---|---|
| 01 Desktop shell, onboarding, and roster | Renderer shell | Launch, onboarding, roster, search, create/import, archive, density, drawer, update entrypoints |
| 02 Workstreams, crews, runs, and Gates | Core work UI | Workstreams, composer, messages, attachments, replies, reactions, branching, queueing, runs, crews, Gates |
| 03 System, settings, engines, and identity | Configuration UI | System navigation, engines, models, operator profile, sigils, voice, keys, telemetry, diagnostics |
| 04 Operations, Cadences, Webhooks, Capabilities, Methods, and Trace | Operations UI | Operations map, Cadences, Webhooks, Capabilities, accounts, crew packages, Methods, Trace |
| 05 Workbenches | Execution surfaces | Browser, Host, Isolated, Remote, Box, VPS, split Workbench, leases, viewers, permissions |
| 06 Voice, Mobile, Relay, Android, and iOS | Companion experience | Voice lines, spoken Gates, Relay, pairing, Android control, iOS app/widgets/live activity |
| 07 Backend HTTP, SSE, and Webhook API | Local harness | Every HTTP/SSE/webhook/internal route, schema, status, event, persistence, failure, race, replay |
| 08 Registry, Conduit, and MCP | Cloud/integrations | Registry, Reach, Conduit, capability broker, MCP servers/proxies/tools, Cloudflare deployment checks |
| 09 Security, privacy, and data migrations | Trust boundaries | Authn/authz, secrets, redaction, paths, injection, telemetry, storage migration, provenance, supply chain |
| 10 Electron, packaging, CI, and release | Delivery | Electron lifecycle, IPC, updater, installers, workflows, artifacts, signatures, release fail-closed paths |
| 11 Accessibility, responsive, visual, and performance | Cross-cutting UI quality | WCAG, keyboard, screen readers, reduced motion, contrast, viewport/zoom, visual regression, performance |
| 12 Automated suites, environments, and evidence | Test operations | Commands, fixtures, fakes, isolation, expected counts, triage, repeatability, evidence retention |
| 13 Route and control traceability | Completion audit | Source-derived inventories matched to owning test IDs and automation/manual status |
| 14 Execution report | Release candidate evidence | Commands executed, results, browser proof, blocked external cases, residual risks, sign-off |
- Data loss, data-directory corruption, data bleed outside Helmryth storage, or unrecoverable migration.
- Authn/authz bypass, secret disclosure, remote exposure of loopback-only control, arbitrary file access, or command injection.
- Gate allow/deny inversion, contradictory spoken consent accepted, destructive action without explicit confirmation, or mobile revocation bypass.
- Wrong-device input, Workbench control sent to an unseen surface, updater pointed at an untrusted repository, or package corruption.
- Application cannot launch, create a first operator, open a workstream, send a direction, render a response, or recover from an interrupted run.
- Any documented route or visible control does not work on a supported platform or state.
- Critical content/control clips at 390px, loses keyboard focus, lacks an accessible name/state, or becomes pointer-only.
- Incorrect persistence, stale state overwriting a newer mutation, duplicate submission, replay/idempotency failure, or unrecoverable retry.
- Engine, capability, Cadence, Webhook, Workbench, Relay, or package lifecycle differs from documented behavior.
- Public product vocabulary, identity, legal route, privacy claim, or release destination is wrong.
- Visual/token inconsistency that does not hide or misstate behavior.
- Rare recovery or performance degradation with a safe workaround.
- External provider variation outside Helmryth's control when the failure is explicit, bounded, and recoverable.
| Environment | Required purpose | Minimum setup | Evidence |
|---|---|---|---|
| Browser development shell | Fast renderer/API verification | Node 24, pnpm, isolated HELMRYTH_DATA_DIR, Vite and harness on loopback |
Browser screenshots, DOM snapshots, console/network log |
| macOS packaged arm64 | Primary desktop integration | Signed or ad-hoc test package, Accessibility/Screen Recording/Microphone permissions | App logs, permission screenshots, DMG/ZIP hashes |
| macOS packaged x64 | Intel artifact compatibility | x64 runner or verified VM | Package verification and launch log |
| Windows 11 x64 | NSIS, update, path, named pipe, and security behavior | Clean VM plus signed/unsigned policy state | Installer log, Event Viewer excerpt, artifact hashes |
| Ubuntu 24.04 Xorg x64 | AppImage/DEB, CUA hold, desktop integration | GNOME Xorg, Xvfb/xdotool for automated smoke | Package smoke log, desktop file validation, screenshots |
| iOS simulator | Navigation, decoding, persistence, accessibility | Xcode, xcodegen, generated HelmrythCompanion project | XCTest/xcodebuild report, screenshots |
| Physical iPhone | Pairing, backgrounding, notifications, widgets, live activity | Provisioned build and reachable Helmryth host | Screen recording, device/host logs |
| Physical Android device | USB authorization and input fidelity | ADB-capable device, trusted host, debug prompt | Screen recording, ADB state log, before/after screenshots |
| Registry Worker local/miniflare | Account, Node, Reach, auth, D1 | Wrangler and test bindings | Vitest and Wrangler dry-run output |
| Conduit Worker local/miniflare | Capability inventory, sessions, MCP | Wrangler, test Composio responses | Vitest and Wrangler dry-run output |
| Owner-controlled release repository | Guarded update/release proof | HELMRYTH_RELEASE_REPO, scoped PAT, draft release |
app-update.yml, release asset list, workflow URL |
Use distinct non-production identities so evidence cannot be confused with real work:
- User profile:
QA Helmwithqa-helm@example.testonly in isolated fixtures. - Operators:
Rivet QA,Cairn QA,Vesper QA. - Crew:
QA Foundry. - Work folders: temporary directories created per run; never a real repository unless that case explicitly tests existing-repository safety.
- Capability aliases:
work-qaandpersonal-qaagainst sandbox accounts only. - Webhook IDs, pairing tokens, Node credentials, and secrets: server-generated test values; never copied into committed Markdown evidence.
- Time: freeze or record timezone/clock when validating Cadences, notification labels, expiry, and update freshness.
All automated tests must isolate home/data/ports. Manual test cleanup must revoke OAuth grants, pairing tokens, tunnels, temporary Nodes, Webhooks, Workbenches, and release drafts created by the case.
- Clean dependency install with the frozen lockfile.
- Typecheck renderer, server, cloud packages, and Swift core.
- Run brand, contrast, QA-coverage, workflow syntax, config-schema, deep-link, and release-target checks.
- Build renderer, server bundle, companion bundle, docs, Registry dry-run, and Conduit dry-run.
Any failure stops later release evidence until diagnosed.
- Root Vitest suite and floor enforcement.
- Conduit and Registry tests.
- Updater, desktop viewer, package link, save-file, boot-probe, and packaged-server Node suites.
- Swift package tests and Xcode simulator tests where XCTest/Xcode are available.
- Linux X11 and package smoke on the supported runner.
- Fresh onboarding at 1440px and 390px.
- Populated Roster, Workstream, Operations map, Cadences, Capabilities, System, Trace, and Workbench states.
- Keyboard-only traversal, modal focus containment/restoration, Escape/cancel, live regions, disabled states, and reduced-motion mode.
- Console/network error review and horizontal-overflow check at every target width.
Run macOS, Windows, Ubuntu, iOS, Android, Box, VPS, OAuth, Registry/Reach, and release-repository cases only in provisioned environments. Attach evidence and mark unprovisioned cases Blocked — external prerequisite; never infer a pass from unit mocks.
- Re-run all static and automated gates on the exact release source state.
- Package each target with publishing disabled.
- Verify artifacts, signatures, manifests, update target, licenses, clean install, upgrade, uninstall, and rollback.
- Upload only to a draft owner-controlled release after the guarded checks pass.
- Publish only after P0/P1 closure and recorded approval from engineering, security, QA, and product owners.
The domain documents contain atomic tests. These journeys prove that state remains correct across boundaries.
- Launch with a nonexistent isolated data directory.
- Verify Helmryth creates its directory without moving neighboring product data.
- Complete Identity and Engines onboarding, skip Mobile, and verify Rivet is the first operator.
- Choose
Build or ship, send a direction, observe run presence, capability activity, and final response. - Restart the app and verify the Workstream, run state, model, Gate policy, and unread state persist.
Expected: no storage outside Helmryth's own data is mutated; no telemetry initializes without explicit consent and an HTTPS owned endpoint; every consequential request stops at a Gate.
- Create Cairn and Vesper, then create
QA Foundry. - Elect a lead operator, delegate a bounded run, and observe handoff status in the workstream and Operations map.
- Trigger a Gate from the delegated operator, deny it, and verify the operator receives the denial and continues or fails explicitly.
- Disconnect and reconnect the browser during the run; verify SSE replay is exact and not duplicated.
- Configure a sandbox capability service and connect two labeled accounts.
- Start a fresh run, select the intended alias, and verify the engine receives only authorized inventory.
- Disconnect one account, verify upstream revocation, retain the second account, and confirm stale cached inventory never claims certainty.
- Remove the managed service and verify fail-closed self-hosted guidance.
- Create a paused Cadence and an independent Webhook for Rivet.
- Verify unconfirmed chat-created Cadences remain inert.
- Confirm and run the Cadence, then deliver a signed Webhook payload twice.
- Verify separate runs, deduplicated Webhook delivery, receipts, notifications, Trace records, and execution-surface selection.
- Configure an Isolated or Remote Workbench and open the viewer in observation mode.
- Let Rivet acquire control, then take controls as the user and verify operator input is withheld.
- Return controls, switch panes in Split Workbench, and verify exactly one controller.
- Force a reload, invalid URL, lease expiry, and runtime loss; verify fail-closed state and recoverable actions.
- Pair an iPhone using a fresh code and verify default permissions exclude cloud Workbench control.
- Follow a Workstream, answer a Gate, and mark it read.
- Revoke the device from System while it is reconnecting.
- Verify every subsequent request and stream reconnect is rejected and the device returns to pairing.
- Prove missing and malformed
HELMRYTH_RELEASE_REPOfail before packaging. - Supply an owner-controlled
owner/repo, package with--publish never, and verify the generated private builder config is removed. - Verify
app-update.yml, artifacts, blockmaps, hashes, licenses, and draft-release destinations. - Exercise updater check, download, staging, install failure, concurrency, and rollback states without contacting an untrusted endpoint.
Retain evidence under an execution-specific directory outside committed source unless it is intentionally added to 14-execution-report.md:
- command transcript with exit status;
- JSON/JUnit test reports;
- browser DOM snapshots, screenshots, console and network logs;
- package file list, hashes, signature/notarization output, and update manifest;
- redacted server/Electron/companion/Worker logs;
- device screen recordings for iOS/Android/permission flows;
- links to CI runs and draft releases.
Evidence must not contain provider keys, pairing tokens, Webhook secrets, private workstream content, precise personal identifiers, or signed temporary viewer URLs.
- Record the first failure before changing state.
- Classify product defect, test defect, environment defect, provider outage, or unsupported prerequisite.
- Reproduce with the narrowest owning case.
- Preserve logs and exact inputs; redact secrets only, not error semantics.
- Fix and run the narrow case, its domain suite, and the release gate affected by the change.
- A flaky pass is not a pass. Define and fix the race or quarantine the case with owner, reason, and expiry before release acceptance.
The release execution report must record:
| Role | Required decision |
|---|---|
| Engineering | Source, build, migration, API, and platform behavior accepted |
| QA | P0/P1 closure, automated counts, manual matrix, evidence completeness accepted |
| Security | Auth, secrets, data, supply chain, updater, mobile, and cloud boundaries accepted |
| Product/design | Vocabulary, states, accessibility, responsive behavior, and public docs accepted |
| Release owner | Destinations, signing identities, artifacts, staged update, and rollback accepted |
No role may sign on behalf of an unavailable external prerequisite. Those cases remain blocked until executed.