Skip to content

Desktop release acceptance

This sheet is the evidence record for the Debian desktop package. Every scenario starts at Not tested, and only a maintainer who has actually run it may change that.

A passing automated test, a screenshot, a source reading, and a real user run are four different kinds of evidence and are recorded as four different things. In particular, a green CI run is not a scenario-level pass: it says the automated portion held on a runner, not that the package installed and worked on a real desktop.

How to record a run

For each real run, record: the source revision, the package digest (sha256sum of the .deb), the OS and architecture, the session type (Wayland or X11), the client and its version, the date, and the result. Put it in the Evidence column as a short line, for example:

2026-10-02 · 60e045f · sha256:3f9c… · Ubuntu 24.04 amd64 · wayland · Claude Desktop 1.4.2 · pass

Evidence categories

Mark Meaning
auto An automated test in this repository covers it. Names the test.
source Established by reading the source. Weakest category; never sufficient alone for a release gate.
shot A screenshot or recording exists.
run A maintainer performed the scenario end to end on a real system.

Packaging

ID Scenario Required result Status Evidence
PKG-01 Graphical installation on a clean supported system without Python or uv OS installer succeeds; Setup appears in the menu and opens without a terminal Not tested —
PKG-02 Install, upgrade, and remove with no graphical session Package operations complete without discovering users or contacting external services Not tested auto partial: tests/desktop/test_packaging_contracts.py::test_maintainer_scripts_do_nothing_per_user_and_reach_no_network
PKG-03 Existing CLI installation Existing commands and configuration retain their original behaviour Not tested auto partial: tests/desktop/test_diagnostics_and_cli.py::test_the_bare_entry_point_still_starts_http
PKG-04 Final archive inspection and isolated engine launch Correct executables, dependencies, metadata, licences, and engine version are present Not tested auto partial: scripts/verify_deb.py runs in the release workflow
PKG-05 Package install with application networking denied No installer or build-tool downloads; local setup opens; online steps report unavailable Not tested auto partial: tests/desktop/test_diagnostics_and_cli.py::test_the_engine_runs_without_the_project_checkout_on_the_path
PKG-06 Upgrade and downgrade, including a running client No implicit data loss; incompatible schema and restart requirements are explicit Not tested auto partial: tests/desktop/test_managed_config.py::test_a_newer_schema_is_refused_without_mutation

Security and privacy

ID Scenario Required result Status Evidence
SEC-01 Missing, locked, or cancelled keyring No plaintext or environment fallback, and no false setup success Not tested auto: tests/desktop/test_credentials_and_runtime.py
SEC-02 Malicious .env, OT_*, or shadow executable on PATH Managed engine uses explicit settings and the packaged binary Not tested auto: test_managed_mode_ignores_ambient_environment, test_a_dotenv_in_the_working_directory_is_ignored
SEC-03 Symlink, bad permissions, malformed or future schema, concurrent writer Fail safely or serialize correctly; preserve the last valid configuration Not tested auto: tests/desktop/test_managed_config.py
SEC-04 Local STDIO startup and protocol activity No listening socket; only valid MCP output on stdout; HTTP auth still enforced Not tested auto: tests/desktop/test_stdio_transport.py
SEC-05 SSRF, redirects, unsafe endpoint, and credential-bearing errors Rejection happens at the right boundary; secrets do not leak Not tested auto partial: tests/unit/test_security.py, tests/unit/test_url_fuzz.py, tests/desktop/test_provider_setup.py
SEC-06 Provider disabled, or cross-provider fallback off Neither explicit requests nor transient failures disclose audio to an unauthorized provider Not tested auto: tests/desktop/test_policy.py
SEC-07 Temporary processing denied A relay-only request fails before download and provider submission; no hidden disk fallback Not tested auto: test_relay_is_refused_before_the_download
SEC-08 Temporary processing allowed, then success, failure, cancel, crash Ownership, bounds, normal cleanup, expiry, and next-session recovery meet the lifecycle Not tested auto: tests/desktop/test_temporary_audio.py
SEC-09 Diagnostic export and hostile sample or client output Only allowlisted support data is exported; nothing executes or renders as active content Not tested auto: test_the_export_carries_only_allowlisted_fields

Configuration

ID Scenario Required result Status Evidence
CFG-01 Add and replace a provider key New setup works; a failed replacement preserves the previous working configuration Not tested auto: tests/desktop/test_setup_transaction.py
CFG-02 Multiple providers and incompatible capabilities Canonical metadata drives selection; no silent downgrade or unauthorized fallback Not tested auto partial: tests/unit/test_routing.py, tests/desktop/test_policy.py
CFG-03 Missing duration, stale or unknown pricing, retry and fallback No misleading hard-budget guarantee; estimates and limits are labelled accurately Not tested auto partial: tests/desktop/test_sample.py, test_the_cost_control_is_never_labelled_a_spending_cap

Client integration

ID Scenario Required result Status Evidence
CLI-01 Supported real client Registration readback succeeds and the client launches the exact bundled engine Not tested —
CLI-02 Shared client store One managed connection is created, without duplicate servers Not tested auto partial: test_re_running_creates_no_second_server
CLI-03 Unsupported or missing client, or missing removal API A precise manual path, or the operation is blocked; no blind config rewrite Not tested auto partial: test_an_unreadable_client_configuration_is_never_rewritten
CLI-04 Existing user-managed or project-managed registration Conflict or explicit takeover is shown; unrelated registrations survive Not tested auto partial: test_a_user_managed_entry_is_a_conflict_not_a_target
CLI-05 Crash or cancellation after each mutation phase Rerun reconciles partial state and safely resumes or compensates Not tested auto partial: test_a_rerun_after_a_client_failure_reconciles
CLI-06 Client rejects disconnection Recovery journal and needed local state remain; failure is visible and retryable Not tested auto partial: test_a_client_refusal_keeps_the_saved_setup

Use and interface

ID Scenario Required result Status Evidence
USE-01 Engine handshake only The packaged engine answers MCP initialization and lists exactly the five tools Not tested auto: test_the_packaged_engine_answers_with_exactly_the_expected_tools
USE-02 Optional public sample with a real provider key A canonical transcript returns; cost and pricing date were shown first Not tested —
USE-03 First run to a working assistant, by a person who did not build it Setup completes without documentation, a terminal, or a maintainer's help Not tested —
USE-04 Wayland and X11, 1280 × 720, 100% and 200% scaling, larger system fonts No clipped buttons, no horizontal form scrolling, navigation stays visible Not tested —
USE-05 Keyboard only, with a real Linux screen reader Every action reachable, focus visible, labels and status changes announced Not tested —
USE-06 French session locale, and the explicit language override Both languages are complete, and no string is assembled by concatenation Not tested auto partial: tests/desktop/test_interface_contracts.py
USE-07 Light and dark system themes Contrast meets WCAG 2.2 AA; no status is carried by colour alone Not tested —

Client compatibility matrix

config/desktop/clients.toml carries a support_status per client. It is the release gate for what the interface may offer as automatic setup:

Status What it means How it is earned
tested Registration and readback verified for this client version A recorded CLI-01 run in this sheet
untested The format is documented, but this build has not been tested against it Default for every new entry
manual_only There is no supported registration API Design decision for that client

Every shipped entry is currently untested. No entry may be promoted to tested without a CLI-01 row above naming the client version and the date.

Known gaps in this release

These are stated so they are not mistaken for tested behaviour:

  • The packaging toolchain has been exercised end to end on Debian 12, not on the supported target: both bundles freeze, the payload passes scripts/check_deb_payload.py, dpkg-deb produces an archive, scripts/verify_deb.py accepts it, the extracted engine answers MCP with its five tools from an isolated environment, and the extracted assistant reaches its event loop. No .deb has been installed on Ubuntu 24.04, so PKG-01 and PKG-02 remain untested.
  • No client has a recorded CLI-01 run, so the interface presents automatic registration as untested for every client and always verifies by reading the registration back.
  • The engine handshake check bounds the tool-listing payload and the whole operation, and discards the engine's stderr. It does not additionally meter the raw protocol byte stream.
  • Bit-for-bit reproducibility is not claimed. The build records its inputs and timestamps, but no independent rebuild has demonstrated an identical artifact.
  • The licence and notice review for the exact bundled Python and Qt components is generated by scripts/generate_notices.py and must still be reviewed by a person before a release.