Platform validation
Environment and limits
Section titled “Environment and limits”Fresh-bootstrap follow-up, 2026-10-28: both Linux prerelease smokes exposed an old uv 0.5.11 resolver failure on the conditional hashed ONNX pins introduced as transitive audio dependencies. The failure reproduces in an empty disposable venv but is masked by installed dependencies. uv 0.13.6 resolves the identical locks without disabling hashes; its official archive digests are pinned in the runtime manifest. Native package validation must use the updated bundled uv. See ADR 0104.
With the updated binary, a disposable Linux/WSL stage completed fresh CPU bootstrap and repeat bootstrap on managed Python 3.12.16, then passed native audio imports, MCP discovery, dashboard origin checks and a Qdrant write/read. Download/release/ADR checks passed 21 tests. Repeat bootstrap disabled alias writing; the first run’s scratch alias was removed from the shell profile.
Windows CI follow-up, 2026-10-28: the native suite exposed open handles on
project-associations.sqlite3 during temporary-source cleanup. SQLite’s
transaction context committed/rolled back without closing the connection.
The association database now closes explicitly on success and exceptions;
a regression checks closure and rollback separately. Native Windows revalidation
is required before promotion to main.
The next Windows run cleared those 46 database-handle errors and exposed one remaining test-isolation issue: the fact-formatting test mocked the old project facet reader, so the new association-aware reader started a real temporary Qdrant process. That test now mocks the current reader and explicitly fails if it attempts to open Qdrant. Native storage remains covered by the runtime smoke.
Follow-up avatar assets, 2026-10-28, Linux/WSL: after the combined commit, the additional iris-brightness/core-blink edits and regenerated GLBs passed generator syntax/lint, the production dashboard build and all 32 Voice/setup browser tests.
Combined change-set validation before publication, 2026-10-28, Linux/WSL: the full Python suite passed 681 tests (one real-model fixture skipped), all 137 dashboard Playwright scenarios passed, and all 59 Electron/extension/site Node tests passed. Full dashboard lint, Go tests and vet, dependency consistency and release-versioning regressions passed. The disposable runtime smoke verified native audio imports, stdio MCP discovery, dashboard origin checks and a native Qdrant download/startup/write/read. The production dashboard was rebuilt from source. These local results do not establish native Windows/macOS behavior; the branch CI and release jobs perform those checks on their native runners.
Progress-aware Chat research, 2026-10-28, Linux/WSL: 108 Python tests passed across research budgets, local/remote chat protocols, section analysis, tool formats, voice and ADR structure. Twenty-one Chat/Settings browser tests passed, including all three research controls and the normal completion notice. The production dashboard build, TypeScript and targeted ESLint checks passed. Tests use fake model/provider responses and clocks to cover research beyond 12 rounds, alternating cycles, changing errors, worker token charging, time overruns, skipped pending mutations and reserved synthesis. Native answer quality and live provider billing were not measured. See ADR 0102.
Chat research completion, 2026-10-28, Linux/WSL: local/remote stub-provider, section-analysis, tool-format and voice tests passed, with additional temporary workspace tests covering the distinct conversation-inbox environment override. Twenty-one Chat/Settings browser tests passed, including the research-completion notice with a visible final answer and editing the numeric research budget. The production dashboard build, TypeScript and targeted ESLint checks passed. Native model answer quality and live cloud-provider calls were not tested for this change. See ADR 0101.
Project association validation, 2026-10-28, Linux/WSL: 93 targeted Python tests passed across associations, canonical sources, moves, workspace ownership, purge, queue dispatch/deduplication, audio ingestion and ADR structure. Nineteen browser tests passed across association review, projects, settings and source reading. The production dashboard build, targeted ESLint checks and Go command tests passed. Local model responses were stubbed for evidence-validation tests; native project-classification quality and Windows/macOS execution remain unverified. See ADR 0099 and ADR 0100.
Recorded 2026-10-23. Local host: Linux x64 under WSL2, Node 25.9.0; Go 1.25.0 and uv 0.5.11 were downloaded into a temporary tools directory for verification. A managed Python 3.12.15 environment was created separately. No release was published and no contributor client profile was used as a setup test.
The initial GitHub history showed successful recent release jobs and the expected v0.8.0 assets. Historical failed-run logs were expired. Source review and executable tests below establish the findings; they do not reconstruct the user’s exact historical macOS/Windows error.
Executed locally
Section titled “Executed locally”Chrome preview ZIP and website — 2026-10-23
Section titled “Chrome preview ZIP and website — 2026-10-23”The follow-up preview keeps Gmail, PDFs, attachments and Google Docs/Sheets marked Coming soon. The extension now offers page/selection capture only. Three standard-library packaging regressions passed: exact runtime-only file set (including exclusion of injected credential/dependency fixtures), deterministic ZIP bytes across source mtimes, correct checksum, and preservation of an existing artifact when a required source file is absent. Four extension transport/sender checks and seven website evidence/download-selection/link tests passed.
The actual generated dist/imprint-chrome-extension.zip was extracted and loaded
in disposable Linux Chromium. Pairing, selected-text save/status and credential
isolation passed; Gmail and Google Docs were rejected with coming-soon messages.
The Astro production build passed. Desktop (1440px) and mobile (375px) screenshots
were inspected and the mobile page had no horizontal overflow. Workflow lint
passed for the updated release and CI workflows. This validates local Linux
packaging/browser behavior; interactive macOS/Windows Chrome installation remains
unverified. Hosted follow-up results are recorded below. See ADR 0030.
The first hosted ZIP gate caught a settings startup race: a typed API address could be overwritten when saved settings finished loading. Connection controls now stay disabled until initialization completes. The browser regression holds the settings response pending, verifies disabled inputs, releases initialization and then connects to its fixture. A delayed-startup fixture reproduced the original release failure locally before the fix. Archive/native packaging now also waits for the Chrome ZIP gate, avoiding downstream work when it fails.
Final source 5fe4118 passed the complete dev CI
and production CI,
including native Linux x64/ARM, macOS Intel/ARM and Windows backend checks. The
v0.18.0 release
passed release validation
and published the Chrome ZIP with the complete native installer/archive set.
The public 14,157-byte ZIP contains 12 runtime/guide/license files, matches the
hosted Chromium-tested artifact byte for byte, and verifies against the release’s
SHA256SUMS. The post-release Pages deployment
passed; the public Chrome page’s download points to that exact v0.18.0 asset and
shows the install guide and seven Coming soon labels. Native installer/backend
validation does not replace interactive Chrome validation on macOS/Windows.
Chrome capture WIP — 2026-10-23
Section titled “Chrome capture WIP — 2026-10-23”On wip/chrome-extension, Linux x64/WSL2 with Python 3.12.15 and Node 25.9.0:
14 browser API/worker/storage regressions passed, including token rotation,
workspace/job isolation, exact origins/preflights, peer/Host rejection, bounded
inputs, account-aware Gmail identities, revoked-queue failure via the actual
dispatcher/subprocess, and in-memory Qdrant source replacement/failure preservation
with deterministic embedding stubs. Existing HTTP boundary (10), indexing/retrieval
(21), queue lock (1) and locale/dispatcher (2) regressions also passed.
The final full Python discovery run passed all 215 tests in 31 seconds.
Four extension transport/sender Node checks and the two existing documentation
link checks passed. The headless Chromium smoke loaded the actual unpacked
extension in a disposable profile, paired it against a synthetic local API,
extracted rendered article/selection/Gmail fixtures, sent a capture and read
job status. Injection into a local fixture verified that content scripts cannot
read trusted credential storage or use the privileged message bridge. Locally
Chromium used the already extracted libraries at
/tmp/imprint-browser-libs/root/usr/lib/x86_64-linux-gnu through
LD_LIBRARY_PATH; no system package installation or real browser/client profile
was used. CI is configured for the same browser smoke after its normal
Playwright Chromium install; that CI run has not been observed yet.
These checks do not establish live Gmail selector compatibility, full-model capture quality, Store approval, native Windows/macOS Chrome execution, real toolbar gesture behavior, or PDF/attachment/editor-export support. See browser extension setup and limitations and ADR 0029.
Existing subsystem checks
Section titled “Existing subsystem checks”| Check | Result | What it establishes |
|---|---|---|
go test ./..., go vet ./... |
Passed | Existing tests plus hook quoting, configuration preservation/idempotence, checksum and Go/Python lock interoperability on Linux. |
make all |
Passed | Go CLI cross-compiles for Linux amd64/arm64, Darwin amd64/arm64, Windows amd64. This is not native execution. |
| Managed Python + base lock install, dependency check | Passed | A clean Python 3.12 CPU runtime resolves and imports. Qdrant client range was corrected after reproducing a compatibility warning. |
| Python unittest suite | Passed, 39 tests | Index replacement/fingerprints/deletions/empty and large files, stale caches, MCP durability/bounds/workspaces, doctor/startup locking, checksums, hooks, Host/Origin and process safety. Windows-specific execution awaits CI. |
| Electron navigation tests | Passed, 3 tests | Exact origin validation, loopback restriction and external protocol allowlist. |
| Dashboard production build | Passed after Next 16.4.2 update | Fresh static export and TypeScript compilation. |
| Dashboard lint | Passed, no errors/warnings | Resolved the previous 14 errors/four warnings; CI now gates lint. |
| Playwright Chromium | Passed, 4 scenarios | Mobile search/filters/modal/focus/shortcut, failure/retry, stale response cancellation and reconnect. API responses are mocked for interaction tests. |
make ui-dist-linux ARCH=amd64 and ARCH=arm64 |
Passed | Both Electron 45.0.0 AppImages build and are staged separately. ARM build is not ARM execution. |
| Electron ASAR inspection | Passed | preload.js and navigation module are in the packaged app. |
| Linux x64/ARM archive packaging and validator | Passed | Runtime payloads and matching executable architectures; staging remains available. |
| Packaged x64 CLI bootstrap with CPU/no-LLM | Passed | Bundled uv provisions managed Python/base dependencies and recognizes the static dashboard. Shell integration was disabled for the test with an unsupported test shell; real profiles were untouched. |
| MCP/API/storage smoke | Passed | Fourteen tools discovered with annotations/schema bounds, health and static HTML served, remote Origin rejected, native Qdrant downloaded/started and point written/read. |
| Default-model semantic store/search | Initially failed, then passed after fix | Reproduced ONNX external-weight cache-path failure. Real model provisioning and ONNX inference pass with regular local files. Follow-up native Qdrant tests pass semantic/hybrid search, exact identifiers, project/source filters, public IDs and workspace isolation. |
| Bash syntax, Python compilation, workflow actionlint, diff whitespace | Passed | Syntax/static checks, including the shared release workflow. |
| Full Linux x64 container | Passed | Fresh dashboard, Python 3.12 hashed CPU install, real entry-point HTTP/static/Host checks, Go doctor and stdio handshake; verified native Qdrant download/start/write/read. ARM container not executed. |
| Astro documentation site build | Passed | Engineering pages, remediation/UX/retrieval reviews and eight ADRs render through the docs symlink (36 pages). |
Qwen model adoption follow-up
Section titled “Qwen model adoption follow-up”Executed on Linux x64/WSL2 with managed Python 3.12.15, pinned CPU dependencies plus llama-cpp-python==0.3.36, and temporary Go 1.25.3/uv 0.5.11. Tests used disposable data directories and loopback ports. Existing user memories and client profiles were not changed.
| Check | Result | Scope |
|---|---|---|
| Python unittest suite | Passed, 58 tests | Adds Qwen templates/padding/empty decoder caches/output projection, finite vectors, profile mismatch, forced reindex, sync IDs, snapshot rejection, queue flags, helper sharing/schema options and context pruning that preserves the current request. |
go test ./..., go vet ./... |
Passed | Includes flag preservation and subprocess regression proving index failures exit nonzero. |
| Hashed base/LLM lock installation and dependency check | Passed | Builds the pinned optional binding on Linux CPU with two compiler jobs; checks compatibility of all 135 installed packages. |
| Real pinned Qwen q8 ONNX inference | Passed | Default 2048-token runtime cap, 1024-dimensional finite normalized query/doc vectors and a tiny relevant/unrelated document check. Exposed and fixed required decoder KV inputs. |
| Native Qdrant 1.17.1 + real embeddings | Passed | Semantic/hybrid store/search, persisted collection identity, equal-dimension mismatch rejection and same-profile sync into a new workspace. Sync exposed and fixed a note-versus-chunk-zero ID duplication. |
scripts/smoke-local-helper.py --model-path ... |
Passed | Real pinned Qwen3.5-4B Q4_K_M, CPU, 8K context; shared chat/tagger instance, closed thinking template, schema classification, structured summary, status tool/result/answer round trip. Tool storage response is mocked. Initial classification confusion led to clearer type definitions; this is one functional case, not a precision/recall score. |
| Astro site build and diff/syntax checks | Passed | 40 pages include model analysis, helper instructions, rebuild procedure and ADR 0010. |
This is functional CPU validation, not a retrieval-quality comparison, helper benchmark or peak-memory guarantee. Native Windows/macOS/ARM/GPU execution of these new model defaults remains pending. Existing release native gates will exercise default ONNX store/search when run; the optional helper smoke is opt-in and has not been added to every installer job. Multi-process model sharing and transactional model migration remain proposed work in ADR 0009.
Local service network boundaries — 2026-10-23
Section titled “Local service network boundaries — 2026-10-23”Validated on Linux x64/WSL2 with Python 3.12.15, disposable data directories and ephemeral ports; see ADR 0024. The full Python suite passed 156 tests; the final focused security run passed 14 tests after adding the public-launcher rejection case. Runtime smoke passed the 16-tool stdio MCP handshake, dashboard/static serving, Origin rejection and actual Qdrant write/read using the cached pinned native binary.
Native socket inspection confirmed that managed Qdrant HTTP/gRPC listened only on 127.0.0.1, with no cluster listener even when inherited configuration requested one. Both ports refused connections through the machine’s non-loopback interface; the HTTP response omitted wildcard CORS. The API’s normal loopback listener answered local HTTP and refused non-loopback TCP. A deliberately public direct uvicorn listener with proxy headers disabled rejected non-loopback requests carrying forged local Host, Origin and X-Forwarded-For headers on API, static and documentation routes.
The separately managed local Ollama service was moved from its bridge address to 127.0.0.1:11434 through a persistent systemd user override. After restart, /api/tags returned 200 locally and the old address refused TCP connections. This verifies binding and availability, not model inference. The separate Naming AI native-client endpoint was updated; its stopped containerized API/worker still need a secured connection arrangement to reach a host loopback service.
The full Docker image rebuilt successfully from source. scripts/smoke-container.sh imprint-loopback-check:local passed in disposable containers, including actual host-loopback publication/NAT access, dashboard/static serving, remote Origin and Host rejection, doctor/MCP discovery and native Qdrant download/start/write/read. Container mode still requires trusted internal networking and loopback publication; these checks do not establish an authenticated remote mode.
Native Windows/macOS/ARM execution of these changes remains pending. Existing historical native release results below do not validate this follow-up.
Desktop startup and service ownership — 2026-10-23
Section titled “Desktop startup and service ownership — 2026-10-23”See ADR 0025. Linux x64/WSL2 validation used disposable data directories and separate build output; existing memories, client profiles, bin/ and dashboard export output were not changed.
| Check | Result | Scope |
|---|---|---|
| Go tests/vet | Passed | Includes a native executable fixture proving ui open launches the shell before provisioning an API daemon and passes the resolved writable Python path. |
| Electron Node tests | Passed, 14 tests | Navigation boundaries, hidden/logged spawn, lifetime-pipe shutdown, splash-before-probe ordering, packaged/development arguments, hide/reopen, explicit Quit, independent daemon reuse, startup cancellation, crash recovery and missing runtime. Window/process doubles do not establish native GUI behavior. |
| Python suite and lifetime tests | Passed, 160 tests in the full run | Actual loopback API stays up while the parent pipe is open and releases its port after EOF; a stalled process exits within its shutdown bound. A subsequent focused three-test release-validator run also passes, including the new required desktop entry point. |
| Dashboard lint and isolated production build | Passed | New desktop Quit action and hide label compile; generated output stays outside the repository. |
| Playwright Chromium | Passed, two desktop scenarios | Hide and Quit use distinct bridge calls; browser-only dashboards have neither desktop control. Preload bridge is mocked. |
| Splash/recovery rendering | Passed | Local startup page renders under its CSP without browser exceptions; loading and retry/log states inspected at 520×360. This is Chromium rendering, not a native Electron launch. |
| Linux x64 Electron directory package and ASAR inspection | Passed | Packaged app includes service.js, preload/navigation and all three startup assets; graphical launch was not exercised. |
| Native Windows PowerShell 5.1 launcher fixture | Passed via WSL interoperability | A disposable ready install directly launches a native GUI executable fixture with source/data/Python paths preserved, including spaces and an apostrophe. The fixture was cross-compiled, then actually executed on Windows; no real client setup ran. This does not exercise Electron or prove absence of console flashes. |
| Workflow validation and macOS launcher syntax | Passed | Native CI now includes these regressions on five targets and the Windows launcher fixture; release ASAR checks require startup assets. |
Before pushing, the change was rebased onto current main (b92f0e8), preserving the update dashboard and automatic-sync work. Combined validation passed 191 Python tests, Go tests/vet, 14 Electron tests, dashboard lint and an isolated production build, workflow lint, and six Chromium desktop/update scenarios. ADR numbers were advanced to 0024/0025 to preserve the intervening decisions.
Interactive Windows/macOS/Linux desktop execution of the updated shell, console visibility, tray/Dock reopening, quitting with active jobs, app-crash recovery and upgrades remains pending. Windows/macOS Python lifecycle execution awaits the native CI jobs. A pre-existing CLI daemon intentionally survives desktop Quit; shared Qdrant also remains independent. First-run bootstrap still uses the existing setup UI, and OS/portable-executable startup can precede the Electron splash.
Native Windows finding — desktop service never started
Section titled “Native Windows finding — desktop service never started”The first native Windows CI run of the lifetime test timed out with an empty service log. A Windows-runner diagnostic dumped the stalled service: the parent-watch thread was blocked reading standard input while the main thread hung importing numpy’s extension module. Without that reader the same service answered in 2.9 s. Windows serializes I/O on a pipe a thread is blocked reading, and a DLL whose C runtime queries the standard handles waits on it. The desktop service therefore never started on Windows; any later DLL load would have hung the same way.
The service now moves the lifetime pipe to a private descriptor and points standard input at the null device before reading it, which also stops child processes from inheriting the pipe. A regression test blocks a reader on the detached pipe while importing numpy. The same Windows runner diagnostic then confirmed the service answers and exits on pipe close.
Native release validation
Section titled “Native release validation”Follow-up 2026-10-23: release run 39910991520 established successful Linux x64/ARM and macOS ARM native execution, then exposed the Intel ONNX wheel failure and silent Windows installer hang. The obsolete run was cancelled after logs were retained. Replacement build 39923142177 is build-only: both macOS installers and both Linux runtime jobs pass, including real default-model inference. Its Windows job now terminates and preserves logs, exposing a separate Windows PowerShell 5.1 native-stderr handling error. That helper path is corrected and covered by scripts/test-windows-setup.ps1; subsequent native results are recorded below when complete. See ADR 0012. The following table is the original validation baseline, not the current run status.
The shared release workflow builds installers before publication. Following the main-only packaging decision (ADR 0014), further native installer validation runs on main; branch CI compiles and tests without packaging. Branch CI 39926994202 passes on all five native targets, including Windows PowerShell stderr/exit-code regression, Go/Python tests and MCP/API/Qdrant smoke. The frontend/browser and workflow jobs pass too.
| Target | Native check | Current evidence |
|---|---|---|
| Windows x64 | Inno silent install in a path containing spaces, final setup result, MCP/API/Qdrant and default-model store/search | Passed on main in release run 39930880913: bounded silent install, managed runtime and real store/search. |
| macOS Intel | Build/install .pkg, writable user runtime, MCP/API/Qdrant and default-model store/search |
Passed in replacement builds 39923142177 and 39924894171, using the Intel wheel pin. |
| macOS ARM | Same native package/runtime checks on ARM | Passed in both replacement builds. |
| Linux x64 | Extract archive, bundled-uv bootstrap, MCP/API/Qdrant and default-model store/search | Passed locally and in both hosted replacement builds. |
| Linux ARM | Same archive/runtime checks on native ARM | Passed in both hosted replacement builds. |
Branch CI runs native Go/Python tests and a lighter MCP/API/Qdrant smoke across these targets. Use the manual Build release artifacts workflow on main to validate packaging without publishing. Non-main refs are rejected before artifact building. Workflow syntax alone does not establish native execution.
The first remediation CI run exposed two additional native differences: macOS /var provenance needed the same canonicalization as scanned roots for missing-source pruning, and the Windows hook execution fixture needed raw cmd.exe command-line syntax instead of Go’s default CRT argument quoting. Pruning now normalizes both sides with a symlink-boundary regression; the Windows fixture invokes the generated hook using cmd’s native quoting. The updated local Python suite passes 59 tests; native rerun results follow below.
Workspace/purge milestone: CI 39930880817 passes across all five native targets, dashboard/browser and container checks. Release 39930880913 passes all native installer/runtime gates and publishes v0.8.1. Default-branch security scan 39930881366 passes with only the documented medium diskcache advisory. These supersede the pending/failure status in the historical narrative. Interactive GUI checks below still remain.
Portable shared knowledge follow-up
Section titled “Portable shared knowledge follow-up”Main CI 39937355570, commit 2560116, passes all five native Go/Python and MCP/API/Qdrant targets, dashboard/browser checks and both container checks. The isolated local suite passes 83 Python tests, Go tests/vet, dashboard lint/export and seven Chromium scenarios. Tests cover device A → B conversation/vector/fact transfer with searchable shared content and unchanged origin, legacy imports, concurrent Go/Python identity creation, approved local mappings and foreign-path pruning exclusion. Windows short paths and macOS /var aliases are canonicalized in expected paths.
Release 39937355749 passes native installer/runtime gates on Windows x64, macOS Intel/ARM and Linux x64/ARM and publishes v0.9.0. Each target verifies the 16-tool MCP handshake, API/static dashboard, native Qdrant and actual default-model semantic/hybrid retrieval with filters, IDs and workspace isolation. Branch CI 39937355045 also passes while skipping release packaging. The updated documentation builds as 48 pages locally.
The first container run exposed a Next/Google Fonts import failure. Roboto is now a pinned local asset with its OFL license in the static export; the replacement container build and runtime smoke pass. Security scan 39937924930 passes on this commit with zero high/critical findings and the same unsuppressed medium diskcache advisory. This establishes automated behavior, not interactive desktop or retrieval-quality certification.
Installer corrections and remaining checks
Section titled “Installer corrections and remaining checks”macOS: corrected setup-helper path, initialized the Cocoa application, safely quoted Terminal fallback arguments, reused an existing vector logo for icon conversion and kept mutable runtime state outside the app. Still verify Finder/Launchpad launch, native progress UI, Terminal fallback, Dock/tray, Intel/ARM upgrades and uninstall on real desktops. The package is not Developer ID signed or notarized (the desktop app inside is signed ad hoc, ADR 0055); clearing quarantine is not signing/notarization.
Windows: corrected early completion signaling, added final result/error/timeout handling, explicit silent setup and no-LLM choice, preserved repair choices and added venv checks. Hooks no longer depend on unquoted POSIX snippets. Still verify interactive profile selection/progress, interrupted installs, cancellation of descendants, repair, uninstall and upgrade with existing memories. Silent installer completion must be checked using .setup-result, not just the installer process exit code.
Linux: archive/bootstrap/dashboard and actual semantic retrieval pass on x64 and hosted native ARM. Graphical Electron startup, tray, FUSE/AppImage and browser fallback still need desktop checks; no local GUI session was available. GPU and OCR profiles remain unverified; optional local helper inference is validated on Linux x64 CPU.
Dependency audit snapshot
Section titled “Dependency audit snapshot”Before compatible updates, the dashboard audit reported 30 advisories (including two critical) and Electron tooling 20 (including one critical). The first audit follow-up still had nine high dashboard advisories through development tooling (braces/micromatch/fast-glob, shadcn/ts-morph and Next ESLint). The 2026-10-23 Trivy remediation removes those unused generator/glob dependency chains, preserves the attributed static styles, and retains explicit lint checks. Dashboard, website and Electron npm audits now each report zero advisories. Website dependencies move together to compatible Astro 7/Starlight/MDX/Sharp versions.
The hosted Trivy remediation scan passes with zero high/critical findings. Its branch’s GitHub Security results retain only the medium CVE-2025-69872 in optional diskcache 5.6.3, which has no patched upstream release; disk caching is explicitly disabled and the finding is not suppressed. See security scanning and ADR 0013. The relay’s non-root user and health probe pass the hosted container check, alongside the full runtime container smoke.
Electron 45.0.0 and its locked builder dependencies report zero advisories in the current npm audit. Both Linux AppImages build. The desktop macOS floor is explicitly 13, consistent with Electron’s platform changes and ADR 0007. This does not establish native GUI, Windows or macOS runtime success. Audits are a dated snapshot, not a guarantee against future advisories.
Release acceptance beyond these smoke tests
Section titled “Release acceptance beyond these smoke tests”Before calling a platform fully supported, retain logs from native jobs and manually verify first launch, client trust/registration, a real search, upgrade preserving memories, repair and uninstall. Signing/notarization, independently authenticated manifests/model revisions and true offline payloads remain open. Release/uv/Qdrant checksum checks and Python profile hash locks are implemented. The installers currently require internet for initial Python, wheels, model and Qdrant downloads.
Automatic pairing, response budgets and native recovery
Section titled “Automatic pairing, response budgets and native recovery”The paired-sync native CI passed Go vet/tests/build, all 161 Python tests and MCP/dashboard/native-Qdrant smoke on Linux x64/ARM, Windows and both macOS architectures. Frontend production build, lint and the full browser suite passed; seven local sync browser scenarios additionally cover explicit pairing, pause/resume and confirmed forget. Final control framing also passed pairing, reconnect, unchanged-data and mutual-forget checks through the native Go relay with separate temporary device profiles.
Two complete public studies recorded 360 successful Claude trials and 920 retrieval searches in total. The follow-up’s 180 trials, 90 pairs, 460 retrieval searches and 60 explicit boundary checks all passed. Published sanitized rows independently reproduce usage, latency and ranking aggregates; no answer-quality improvement is claimed. The presentation site builds 56 pages, passes five Node adapter/link tests and browser checks at 390/1280 pixels. Its methodology has a separate route and Markdown links resolve to actual documentation pages.
Release 39969601759 built all desktop payloads and passed Windows, Apple Silicon macOS and both Linux package/runtime gates, but failed the Intel macOS runtime store. A leftover embedded-era idle timer closed an HTTP client during cold embedding work. This is a real application race, not evidence that the package passed. The isolated regression reproduces the failure before the fix; ADR 0022 retains HTTP clients until cleanup and exercises slow single, batch and query operations. The corrected-source native rebuild passed as recorded below; the failed artifact was not published.
Manual graphical installation/upgrade/uninstall, two physical devices and public-relay reconnection were not newly executed for these changes; automated native runners and isolated relay profiles provide the recorded evidence. Client profiles and existing user memories were not used as test fixtures.
The corrected source passed CI 39972913971 on all five native targets, including all 162 Python tests, the complete frontend checks and both container smokes. A separate Linux check used the real Qwen model and Qdrant, deliberately held embedding for 35 seconds, then durably stored and retrieved the note successfully. Source-level benchmark audits also verified that all 612 filesystem tool calls in the first study and 622 in the follow-up stayed within their frozen public corpus.
The corrected release run 39972914308 passed every native package/runtime gate, including Intel macOS, and published v0.13.0 on 2026-10-23 at 15:10 UTC. Its nine release assets include both macOS .pkg installers, the Windows setup installer, all five platform archives and SHA256SUMS. The successful rebuild validates the HTTP-client lifetime correction on native installed runtimes rather than merely retrying the old failure.
Windows installer → WSL clients — 2026-10-23
Section titled “Windows installer → WSL clients — 2026-10-23”ADR 0026 adds explicit per-profile registration of WSL Claude Code/Codex against the Windows runtime. Checks used disposable Linux profiles and Windows data; an existing installed Windows Python 3.12.8 interpreter/dependencies were reused read-only. No real Claude/Codex profile was registered or edited, and no model inference/real memory store was used.
| Check | Result | Scope |
|---|---|---|
| Go tests and vet on Linux | Passed | Enumeration decoding, explicit distro arguments, profile/settings/server/hook/rule preservation, idempotence, removal, quoting, malformed TOML and foreign launcher protection. |
| Native Windows Go WSL fixtures | Passed | Windows-compiled tests actually executed through WSL interoperability, including native Windows configuration-file replacement and backups. Cross-compilation was followed by execution. |
| Python unittest suite | Passed, 199 tests | Includes path mapping, custom drive mount roots, source-key preservation, unchanged workspace approval, metadata-only hook translation and preventing all Stop consumers for an unapproved transcript. Final release-validation fixtures additionally pass after asserting selection backups are excluded. |
| Real WSL → native Windows runtime | Passed | Both clients’ disposable registrations run twice without losing other servers, then are removed. Actual stdio initialize/list-tools discovers 16 tools; device context retains the Linux working directory and reads the same Windows workspace-root store written through the CLI bridge. |
| Linux and Windows-drive project roots | Passed | Real handshakes from Linux files and a mounted Windows drive, root approval and round-trip path hints; a profile stored on a Windows drive also registers/removes. Spaces, Unicode and apostrophes are present in fixture paths. No assumption that drive mounts are exported through the WSL UNC provider. |
| Native Windows PowerShell 5.1 setup regression | Passed | Successful setup replays two saved distro/target choices with spaces; stderr remains progress and nonzero failures propagate. Test fixtures run from a native temporary directory and retain the process handle so ExitCode is dependable. |
| Native Inno Setup 6.7.3 compilation | Passed | Actual installer and new WSL selection page compile with a disposable release payload. The official compiler was run in portable mode from Windows temporary storage. This is compilation, not an interactive installer walkthrough. |
| Documentation website build | Passed, 61 pages | New ADR, setup/removal instructions and engineering links render with the normal generated benchmark/release data. |
| Electron regression suite/workflow lint/diff whitespace | Passed | Existing 14 desktop tests stay green; native CI discovers the new Go/Python tests and its existing setup fixture now covers saved WSL choices. |
The interop smoke is opt-in at scripts/test-wsl-interop.py; hosted CI does not assert that a WSL distribution is installed. Native GUI selection/progress, client reload/trust and full conversation ingestion against live Claude Code/Codex versions still need manual checks. Codex transcript coverage remains the current adapter’s limitation. Custom users/profiles require explicit flags and must be accessible through the Windows account’s WSL filesystem provider; registration does not change their permissions or elevate privileges. WSL interoperability disabled, inaccessible distributions or unreadable profiles fail selected registration rather than report success.
Symmetric uninstall milestone (2026-10-23)
Section titled “Symmetric uninstall milestone (2026-10-23)”ADR 0027 connects native uninstall to shared disable cleanup and preserves memories by default. Tests used private profiles/data and a copied CLI in a private Windows install tree. Existing installed Windows Python was reused read-only for WSL bridge probes; real client configurations and memory stores were not used as fixtures.
| Check | Result | Scope |
|---|---|---|
| Linux Go tests and vet | Passed | Supported JSON/TOML registries, nested OpenClaw entries, Claude/Codex/Cursor hooks, permissions/rules, unrelated settings, repeated cleanup, malformed configuration, foreign runtimes, shared Cline rules, shell aliases/symlinks and legacy/custom WSL selection coexistence. |
| Native Windows Go cleanup fixtures | Passed | Actual Windows execution of the compiled cleanup/profile tests and durable config updates. The symlink portion is skipped because this Windows account lacks symlink privilege; alias assertions execute, and Linux exercises symlink ownership. |
| Native Windows PowerShell 5.1 helper | Passed | Successful stderr diagnostics, propagated exit 23 and missing CLI; the helper invokes disable and preserves fixture memories. |
| Native Windows + actual WSL cleanup | Passed | scripts/test-wsl-uninstall.py registers disposable custom Claude/Codex profiles from a copied private Windows CLI. Native disable removes both WSL bridges plus native entries/hooks/permissions, preserves other config and remains idempotent. Invalid native TOML blocks uninstall and preserves a runtime sentinel; retry succeeds and retains a memory sentinel with default flags. |
| Native Inno Setup 6.7.3 | Passed | Current installer compiles. An isolated installer with a unique application ID/name and executable stand-ins runs install, failed cleanup, then successful uninstall: failure keeps program files; success removes them and retains a data sentinel. PATH logic is redirected to a private fixture registry key; unrelated user PATH remains untouched. |
| Python suite | Passed, 201 tests | Includes release exclusion of journals/backups/logs and an actual Git fast-forward/divergence fixture for the dev synchronization script. |
| Documentation/workflow checks | Passed | Website builds 62 pages; actionlint, shell syntax and diff whitespace checks pass. |
Windows release CI now also uninstalls its disposable real installation and checks preserved data plus Codex registration/hook/rule removal. This new hosted release gate is implemented; the local stand-in installer and copied-CLI checks above are the executed evidence. Native macOS .command/package uninstall and interactive OS/client reload behavior remain unexecuted locally; macOS script syntax is checked without claiming native execution. Linux cleanup runs natively in WSL; an interactive AppImage desktop uninstall was not exercised. Old custom WSL profiles created before journaling require explicit removal with their original flags; custom native profiles require their profile environment. Configuration recovery backups remain inert.
The first hosted Windows uninstall regression completed its assertions but inherited exit 1 from its intentional missing-CLI case. The fixture now clears that asserted native status before returning to GitHub Actions; an Actions-style native PowerShell wrapper is used locally to verify the script returns success. This changes test-runner reporting, not cleanup behavior.
ONNX Runtime provisioning and first-run log (2026-10-24)
Section titled “ONNX Runtime provisioning and first-run log (2026-10-24)”Triggered by a Windows GPU install that aborted on a first-run.log sharing violation and later failed every ingest with module 'onnxruntime' has no attribute 'InferenceSession'. See ADR 0032.
| Check | Result | Notes |
|---|---|---|
| First-run log sharing (native Windows PowerShell 5.1) | Passed | Out-File -Append fails against a share-read poller (Inno LoadStringFromFile, the original wizard) and never against a read/write-sharing one. scripts/test-windows-setup.ps1 now polls concurrently and checks UTF-8 decoding and the absence of ANSI escapes; each new check fails on the defect it guards. |
| Wizard page compile (Inno Setup 6 ISCC) | Passed | The real ProfilePage.iss, WSLPage.iss and SetupOutputPage.iss compile in a minimal wrapper script. A full installer was not built. |
imprint bootstrap end to end (Linux x64, uv 0.5.11, locked wheels) |
Passed | Scratch install tree with an isolated HOME and a fake nvidia-smi. Cases: fresh CPU install, the damaged Windows state (GPU dist-info with only capi/), unchanged rerun (audit only), auto→CPU, CPU→GPU, both builds installed, auto without a GPU, damaged CPU build. Each ended with one complete provider and a loadable InferenceSession. |
| Lock split | Passed | ONNX Runtime and its exclusive dependencies moved from base.lock.txt to cpu.lock.txt with identical pins, markers and hashes; llm.lock.txt unchanged. pip 24.3 accepts the identical hashed pins repeated across base and overlay. |
| Go, Python, workflow | Passed | go test ./..., full Python suite (232 tests), actionlint. |
Not run: native Windows or macOS bootstrap with the new layout, and any real CUDA session. The locked onnxruntime-gpu 1.31.0 links CUDA 13, while setup’s CUDA retry targets CUDA 12.
GPU runtime with bundled CUDA 13 (2026-10-24)
Section titled “GPU runtime with bundled CUDA 13 (2026-10-24)”See ADR 0038.
| Check | Result | Notes |
|---|---|---|
| GPU lock on native Windows (RTX 4080 Laptop, driver 581.80) | Passed | gpu.lock.txt installs with --require-hashes into a fresh venv in 39 s (1.86 GB). The setup smoke script prints OK; a 512×512 MatMul runs on CUDAExecutionProvider (onnxruntime-gpu 1.31.0). |
imprint bootstrap on Linux (WSL2, same GPU) |
Passed | A pre-0038 “broken” verdict is retried and passes; a driver reporting CUDA 12.8 makes auto and gpu install the CPU runtime with the driver message; the real driver switches auto back to the GPU runtime. |
| First-start collection race (native Windows, scratch Qdrant 1.17.1) | Passed | 8 threads × 10 fresh collections: the previous code failed 48 of 80 calls with Qdrant’s “0 of 0 read operations failed” 500; the locked creation succeeded on all 80, one create per collection. |
Not run: Linux aarch64 GPU hosts, and pre-R580 drivers on real hardware.
CUDA only for GPU embedding (2026-10-25)
Section titled “CUDA only for GPU embedding (2026-10-25)”See ADR 0062. Machine: RTX 4080 Laptop (CUDA 0, compute 8.9) and GTX 1060 (CUDA 1, compute 6.1), driver 581.80, Windows 11 25H2, plus WSL2 Ubuntu. Every Windows run used scratch trees and venvs under %TEMP%, with an isolated USERPROFILE; the installed runtime was only read.
| Check | Result | Notes |
|---|---|---|
| Libraries the CUDA provider needs (native Windows) | Passed | Without cuFFT, cuRAND and nvJitLink, Qwen3-Embedding-0.6B int8 and BGE-M3 fp16 ran on CUDAExecutionProvider (batches 1 and 4, up to 1,240 tokens; BGE-M3 0.24 s for 4 on CUDA against 14.7 s on CPU). Without cuDNN the session started and the first attention node failed. |
| Libraries the CUDA provider needs (Linux, WSL2) | Passed | The same with cuRAND kept: libonnxruntime_providers_cuda.so links libcurand.so.10, and without it the provider falls back to CPU. |
| New CUDA check (native Windows) | Passed | python -m imprint.gpu_runtime check passed on the trimmed set; without cuDNN it failed on the Conv node, where the old Identity check would have passed. |
| Replacing a loaded runtime (native Windows) | Passed | uv uninstalled and reinstalled ONNX Runtime, and installed the GPU build over the CPU one, while another process had it loaded; that process kept working. Deleting a loaded DLL’s last link (in uv’s cache) fails with “Access is denied”; uv cache clean drops the entry first, and uv cache prune freed the files after the process exited. |
| Migration with the real CLI (native Windows) | Passed | A venv from ADR 0038’s lock with model.device=cpu (venv 2,108 MB, cache 2,178 MB, shared links) moved to the CPU build in 40 s while a process held ONNX Runtime: venv 306 MB, cache 381 MB, 1,773 MB freed at once, 25 MB more at the next setup. Download: one 15 MB wheel. |
| Enabling GPU embedding (native Windows) | Passed | imprint config set model.device gpu named the GPU and the download. imprint bootstrap installed 7 packages (venv 1,753 MB, NVIDIA 1,239 MB) and passed the check. |
Dashboard provisioning (native Windows, imprint ui start) |
Passed | DELETE then PUT of model.device queued bootstrap jobs (10 s and 68 s); the server restarted with a new pid after each, and Settings then showed the GPU without the download note. |
| Migration and dashboard flow (Linux, WSL2) | Passed | 2.8 GB of venv and cache down to 485 MB; GPU and back through queued jobs with restarts; unusable configurations (CUDA_VISIBLE_DEVICES=, model.gpu_device=1) kept the CPU build with the reason in setup, config set and doctor. |
Not run: Windows 10, Linux arm64 GPU hosts, drivers older than R580, a real installer update from a release with the old runtime, and machines with only AMD or Intel GPUs.
Learn from WSL and Codex stores (2026-10-24)
Section titled “Learn from WSL and Codex stores (2026-10-24)”See ADR 0037. These checks ran on a native Windows installation with Claude Code and Codex registered for WSL Ubuntu. Before the change, its queued learn job printed “No Claude Code projects found” and “No transcripts found”. None of the checks wrote to the installation or its data: ownership checks used a copy of the workspace policy in %TEMP%.
| Check | Result | Notes |
|---|---|---|
Store discovery (cross-compiled Go test binary, real .wsl-registrations.json) |
Passed | Returned this computer’s C:\Users\<user>\.claude and .codex, then one Ubuntu group holding both registered stores, with the drive mount table read through wsl.exe in 0.15 s. |
| Missing distribution | Passed | Reported as WSL NoSuchDistro is unavailable (… There is no distribution with the supplied name. Error code: Wsl/Service/WSL_E_DISTRO_NOT_FOUND). The other groups were kept. Before the fix, the message after the exit status was empty, because wsl.exe writes its errors to stdout in UTF-16. |
| Path context handed to the installed interpreter | Passed | The Ubuntu group resolved /home/<user>/.claude to \\wsl.localhost\Ubuntu\home\<user>\.claude and /mnt/c/… to C:\…. This computer’s group left paths unchanged. |
Listing and identity through \\wsl.localhost |
Passed | 114 Claude Code transcripts in 5.8 s and 32 Codex rollouts in 1.2 s, each with a distinct source key. Projects named from the recorded cwd matched the folder-derived names. Codex sessions got the same names for the same directories. |
| Ownership read of every WSL conversation | Passed after a fix | Resolving the cwd on every record cost about 20 ms per record: a 0.52 MB transcript took 2.1 s, of which 1.97 s was 98 resolutions of 2 distinct directories, and a full pass did not finish in 25 minutes. With one resolution per distinct cwd, the same transcript takes 0.1 s, and all 146 conversations (1.8 GB) take 407 s. All 146 belong to the default workspace, whose only root is a Windows folder. |
Not run: a complete imprint learn that embeds and stores into the installation’s data directory, and the dashboard Learn action on Windows. Every Claude Code project folder on this machine has auto-memory files, and their ownership rule rereads every transcript beside them on each run: about 3 minutes for these 1.2 GB through \\wsl.localhost.
Learn from Cursor stores (2026-10-25)
Section titled “Learn from Cursor stores (2026-10-25)”See ADR 0052. These checks ran on a Windows installation whose Cursor app works on WSL Ubuntu projects through Remote-WSL. The conversations are in the distribution’s ~/.cursor and the Windows profile’s projects/ holds none. All checks were read-only: ownership used an empty workspace policy in a temporary data directory, and nothing was stored.
| Check | Result | Notes |
|---|---|---|
| Folder resolution, natively in WSL | Passed | Of 21 project folders, the 4 named after existing directories resolved to them, the first in 52 ms and the rest in under 2 ms. The other 17 named no directory: numeric empty-window folders, tmp-* folders, a .code-workspace folder and a cleanup folder. |
| Conversations, natively in WSL | Passed | 4 conversations; subagent files skipped. Each was owned, keyed conversation/<id prefix> and named arnia-gmv-reporting-service, airportlabs-challenge or arnia-shopware, with 40, 21, 4 and 1 exchanges of the user’s query and the assistant’s text. |
| The same through the installed Windows interpreter | Passed | With the Ubuntu path context, the store resolved to \\wsl.localhost\Ubuntu\home\<user>\.cursor. Every folder resolved as natively, in 1 to 17 ms. Identity, parsing and ownership of the 4 conversations took 0.34 s. |
| Native Windows folder names | Passed | C-Users-<user>-AppData-Local-Programs-Imprint and its lower-case …-imprint-bin resolved to the installation folders; the Windows profile’s C-Users-…-Temp-<uuid> folders and its copy of the WSL project folder named no directory. |
Profile probe (cross-compiled CLI, wsl list) |
Passed | The real Ubuntu profile reported cursor_home beside its Claude Code and Codex profiles. |
| Go learn, WSL and cleanup tests (cross-compiled Windows test binary) | Passed |
Not run: registering Cursor in the installation (imprint wsl setup --target cursor writes its journal), the installer wizard with a Cursor selection, and a complete imprint learn that stores Cursor conversations.
Cline setup and learn (2026-10-25)
Section titled “Cline setup and learn (2026-10-25)”See ADR 0056. No Cline is installed on this machine and no Cline sessions exist, so sessions are fixtures built from the Cline SDK’s schemas (cline/cline@40c5d99). Every check used a temporary installation directory in %TEMP%, a disposable WSL home in /tmp and the installed Windows interpreter read-only; nothing was written to the installation, its data or a real client profile.
| Check | Result | Notes |
|---|---|---|
| Go Cline, WSL, learn, cleanup and client tests (cross-compiled Windows test binary) | Passed | Includes setup in a disposable home with CLINE_DIR, CLINE_DATA_DIR and CLINE_MCP_SETTINGS_PATH, disconnect of old and new registrations, and the Cline WSL layout. The jsonutil tests passed too. |
Profile probe (cross-compiled CLI, wsl list --json) |
Passed | The real Ubuntu profile listed the new cline target with no profile, since ~/.cline does not exist, beside its Claude Code, Cursor and Codex profiles. |
imprint wsl setup --target cline into a disposable home (--home /tmp/…, --python the installed interpreter) |
Passed | Wrote <home>/.cline/imprint-wsl (mode 700), the imprint entry beside an existing server in data/settings/cline_mcp_settings.json with a backup, and rules/imprint.md beside a user rule. The launcher’s probe ran the Windows interpreter from WSL. The journal recorded cline_home. |
imprint wsl remove --target cline |
Passed | Removed the entry, the rule and the launcher; kept the other server and the user rule; emptied the journal. |
| Unknown target | Passed | imprint wsl setup --target vim failed with target must be claude-code, cursor, codex or cline before probing. |
| WSL Cline store through the installed Windows interpreter | Passed | With the Ubuntu path context, the sessions directory resolved to \\wsl.localhost\Ubuntu\tmp\…\.cline\data\sessions. The session was found, keyed by its full id, named imprint-memory-layer from the manifest’s Linux cwd, owned by the default workspace, and parsed into the two typed questions. |
| Windows PowerShell 5.1 setup regression (WSL interop) | Passed | Saved selections including cline were replayed to the CLI. |
| Installer wizard pages (portable Inno Setup compiler) | Passed |
Not run: a real Cline on any surface loading the settings and rule, real Cline sessions, the installer wizard with a Cline selection, a complete imprint learn storing Cline sessions, and macOS.
GitHub Copilot setup and learn (2026-10-25)
Section titled “GitHub Copilot setup and learn (2026-10-25)”See ADR 0057. No Copilot conversations exist on this machine, and the Copilot CLI is not installed. Both Copilot homes hold only config.json and logs, so sessions are fixtures built from the Copilot SDK’s event schema. Every check used a temporary installation directory in %TEMP%, a disposable WSL home in /tmp and the installed Windows interpreter read-only; the real ~/.copilot was only probed.
| Check | Result | Notes |
|---|---|---|
| VS Code 1.143.1 bundle (installed, read only) | Confirmed | chat.mcp.discovery.enabled defaults to copilot: true; that source reads <COPILOT_HOME or ~/.copilot>/mcp-config.json, the remote host’s in a remote window. The Agent Host resolves the same file, and the customization migration moves user mcp.json servers into it. |
| Go client, WSL, learn and cleanup tests (cross-compiled Windows test binary) | Passed | Includes Copilot setup and disconnect in a disposable home and the Copilot WSL layout. |
| Copilot hook commands in Windows PowerShell (cross-compiled hooks test, installed interpreter) | Passed | Paths with spaces and apostrophes. SessionStart printed a top-level additionalContext; Stop printed {}. |
Profile probe (cross-compiled CLI, wsl list) |
Passed | The real Ubuntu profile reported GitHub Copilot not enrolled /home/<user>/.copilot. |
imprint wsl setup --target copilot into a disposable home |
Passed | Wrote the launcher, the imprint entry beside an existing server in mcp-config.json, the managed block after the user’s text in copilot-instructions.md, and hooks/imprint.json beside a user hook file, with backups of the changed files. |
Registered hooks run as Copilot runs them (bash -c, PascalCase payloads) |
Passed | SessionStart returned additionalContext from the Windows interpreter through the bridge. Stop, with a transcript that records no context, was skipped by the bridge’s ownership check and printed {}. |
| WSL Copilot home through the installed Windows interpreter | Passed | The home resolved to \\wsl.localhost\Ubuntu\tmp\…\.copilot. A session with a context was keyed by its id, named imprint-memory-layer, owned and parsed into the two typed questions; the session without one was not owned. |
imprint wsl remove --target copilot |
Passed | Removed the entry, the block, the hooks file and the launcher; kept the other server, the user’s text and the user’s hook file; emptied the journal. |
Needs a live, logged-in Copilot: that Copilot honors the SessionStart context and the instructions file, that Stop payloads carry transcript_path in VS Code’s harness and the CLI, that the WSL Agent Host runs the distribution’s hooks and MCP server, and real sessions. Not run: VS Code, the CLI or JetBrains loading mcp-config.json, the installer wizard with a Copilot selection, a complete imprint learn storing Copilot sessions, and macOS.
PersonaPlex startup memory prototype (2026-10-24)
Section titled “PersonaPlex startup memory prototype (2026-10-24)”See ADR 0041 and the prototype guide (removed, ADR 0118). This validates an experimental adapter, not a supported voice/avatar product.
| Check | Result | Evidence and limits |
|---|---|---|
| Adapter tests, Linux/WSL2 | Passed, 12 tests | Actual MCP discovery/calls and stdio child with disposable storage fixtures; workspace/project isolation, bounded evidence, exclusive exports, drift rejection, local browser boundaries, server-side context injection, binary WebSocket frames, pinned cache-only lookup and owned-child shutdown. Binary frames are fixtures, not decoded speech. |
| Full Python suite, isolated data directory | Passed, 287 tests | Existing behavior and release-validator regressions included. No real client profile was registered or used as a test fixture. |
| NVIDIA source contract | Passed | A temporary clean checkout at 3428dfd95309a7f3c84fd93259ded0f810d1ff91 passes revision, tracked-file cleanliness and server SHA256 checks; this does not import the model stack. |
| Test dependency distribution boundary | Passed | The actual rsync release exclusion filter retains runtime locks and excludes both PersonaPlex test-overlay files; validator fixtures reject either file if included. No release archive or installer was produced. |
| Documentation | Passed | Site production build, repository-link checks and whitespace checks. |
| Pinned model access | Unavailable | A metadata-only request using the available Imprint/Hugging Face credentials returned GatedRepoError; no weights were downloaded. |
Not run: real PersonaPlex model import/load, microphone capture, audible responses, speech grounding, Opus decoding, interruption/echo tests, GPU latency/VRAM benchmarks, native Windows/macOS/Linux desktop execution, floating-head rendering or installer/update behavior. CI now installs the hashed adapter-test overlay on its native matrix; those jobs have not been executed for this branch in this session.
LFM2.5-Audio CPU experiment (2026-10-24)
Section titled “LFM2.5-Audio CPU experiment (2026-10-24)”The user selected LFM2.5-Audio-1.5B as primary after requesting a smaller option. See ADR 0042, the experiment guide and raw smoke evidence. Work continues on feat/local-voice-avatar. PersonaPlex model access was subsequently granted using the interactive shell’s credentials, but its setup/downloads were stopped before model inference when the direction changed.
| Check | Result | Evidence and limits |
|---|---|---|
| Native model/runtime installation | Passed, Linux x64 under WSL2 | Four Q4 artifact checksums/sizes and the official Ubuntu runner archive verified at 7d525f883a077e20afb782f2ff618edcae0e39e4; unpacked native files reverified before execution. Embedded build: 7641 (68d8edf2). No PyTorch profile needed. |
| Real speech synthesis | Passed, two smoke runs | Produced non-silent 24 kHz mono float32 WAV for an English question. One run generated 2.30 seconds of audio in 1.83 seconds including native startup, excluding asset verification. No listening panel or pronunciation-quality score. |
| Real speech recognition | Passed, two smoke runs | The same model transcribed the synthesized question correctly. Synthetic speech is not representative of microphone/noise/accent coverage. |
| Memory-conditioned speech replies | Passed, two names per run | The same WAV question returned “Nimbus” or “Comet” according to the current MCP snapshot, omitting the distractor. MCP uses the real registry with disposable retrieval fixtures at the storage boundary; no embedding/retrieval-quality claim or real user-memory test. |
| Local CPU resource measurements | Observed | Four threads, no GPU: fresh native process/model loads took 2.95–4.52 seconds for complete reply generation across two runs; sampled peak RSS about 1754 MiB. Timings exclude asset verification and include startup. Filesystem caches/load were uncontrolled, and first-audio latency was not measured. |
| Regression suite | Passed, 295 Python tests | Includes 8 new LFM tests plus the earlier PersonaPlex adapter tests. Fixtures cover idempotent install/repair, archive paths/symlinks, tampering, float/PCM WAV, identity isolation, privacy, bounds and owned-child timeout. |
Not run: live microphone input, streaming playback, first-audio latency, barge-in, echo cancellation, learned full-duplex conversation, live MCP tool use/writes, voice persistence, head rendering, real GPU inference or native Windows/macOS/ARM execution. Native CI for this branch has not been run in this session. The result establishes a promising small CPU speech experiment, not the complete real-time avatar assistant.
Echo live voice pilot (2026-10-24)
Section titled “Echo live voice pilot (2026-10-24)”Follow-up to the offline experiment: live voice guide, ADR 0043, real transport/model evidence and repeat-run evidence, plus native WSLg evidence. The user chose the Echo holographic particle head with push-to-talk and optional hands-free/VAD. The same-local-chat route is implemented alongside LFM reasoning.
| Check | Result | Evidence and limits |
|---|---|---|
| Private live worker build | Passed, Linux x64 CPU/WSL2 | Built pinned tdakhran/llama.cpp source ec9d1fdd9cc18643c5e161b65b8053f6f6f34a4b with Imprint’s loopback/auth/origin/cancellation patch. Source archive and weights verified; executable/patch fingerprints checked at launch. |
| Native listener boundary | Passed | Authenticated health succeeds; incorrect bearer or any browser Origin returns 403. No wildcard CORS. Browser traffic uses Imprint’s separately checked HTTP/WebSocket boundary. |
| Real synthetic speech question | Passed, two runs | Native TTS generated a question, ASR recognized it, retrieval-conditioned LFM streaming returned Nimbus. First audio 1.911–2.197 s after submitting the completed utterance, whole generation 3.374–3.622 s, output audio 3.02 s. Warm worker; input recording/endpoint time and real retrieval embedding cost excluded. Storage retrieval is a disposable fixture. |
| Warm native streaming probe | Observed | Separate short TTS/interleaved native requests first emitted audio at approximately 0.259/0.319 s after request, respectively. These exclude ASR, retrieval and chat reasoning and are not user-perceived end-to-end latency. |
| Workspace ownership | Passed | A lease for default still retrieved default after the disposable dashboard workspace switched to other. |
| Mid-speech interruption | Passed over real WebSocket, two runs | Cancel acknowledgement 0.0183–0.0209 s; the owned native process had exited. Fresh response after cancellation worked, with no stale generation IDs. This does not measure human acoustic onset or speaker echo. |
| Same-chat route | Passed with fixture reasoning and real streamed TTS | Invokes the existing chat.stream_reply with captured workspace, cancellation and enforced read-only tools; produced native speech. Actual Qwen reasoning/total voice latency was not benchmarked. |
| Python regression suite | Passed, 307 tests | New ownership, capability expiry/replay/origin, cancellation, read-only tools, long spoken tails, WAV bounds and runtime integrity cases, plus existing full suite. |
| Audio/controller tests | Passed, 3 tests | Actual TypeScript VAD and WAV encoder exercised for silence/click rejection, onset/endpoint, speaking hysteresis, bounds and PCM metadata. |
| Dashboard browser tests | Passed, 51 tests | Includes 4 new voice cases: real GLB load, interrupted playback/stale chunks, compact layout and actual AudioWorklet capture from Chromium’s synthetic microphone. No physical microphone accessed. |
| Electron policy/lifecycle | Passed with controlled doubles | Separate transparent sandboxed companion, scoped IPC, optional pin, destroy on close/quit and main-frame audio-only permission checks. |
| Native graphical companion | Passed, Electron 45.0.0 on Linux/WSLg | Disposable profile, actual rendered head, separate window, always-on-top, synthetic-microphone permission, Stop and Close. WSL test used --no-sandbox and software WebGL flags; this does not validate a packaged Linux sandbox, native Windows or macOS. Preview. |
| Build and documentation | Passed | UI static export, TypeScript/lint checks, documentation production build and whitespace checks. Generated UI build output is excluded from this change. |
Not run: physical microphone/acoustic echo/room noise, accent and intelligibility ratings, robust hands-free speakerphone behavior, actual Qwen voice latency, phoneme-aligned animation, learned full-duplex reasoning, native Windows/macOS/ARM speech workers, GPU inference, packaged desktop sandbox/installer tests or CI. No real user memory stores or client profiles were used as test fixtures.
Native Echo and transparent desktop (2026-10-24)
Section titled “Native Echo and transparent desktop (2026-10-24)”Follow-up to the Linux pilot: ADR 0044 and the current setup guide. The optional live worker now builds natively for Windows x64, macOS Intel/Apple Silicon and Linux x64. Its model/cache is external to distributions; no release or installer was published for this work.
Source b21e0db passed the complete
native voice workflow.
Raw platform evidence preserves
the target/build fingerprints and separate speech/desktop summaries.
The general CI run
also passed its five native backend targets, frontend and workflow checks.
| Native runner | Speech and desktop | First audio | Whole speech turn | Cancel acknowledgement | Desktop renderer |
|---|---|---|---|---|---|
| Windows x64, Server 2025 | Passed | 2.562 s | 7.984 s | 109.0 ms | Software WebGL |
| Intel Mac, macOS 15.7.9 | Passed | 4.060 s | 12.679 s | 68.7 ms | Software 3D canvas |
| Apple Silicon, macOS 26.6.2 | Passed | 2.955 s | 5.415 s | 59.2 ms | Software 3D canvas |
| Linux x64, Ubuntu hosted runner | Passed | 4.340 s | 15.745 s | 19.0 ms | Software WebGL |
These are individual synthetic CPU runs with a warm speech worker. First audio starts after submitting the completed utterance and includes ASR and fixture retrieval; it excludes recording/endpointing and real chat-model inference. Cancellation measures protocol acknowledgement and owned-process exit, not human speech onset. Hosted load and caches were uncontrolled; these are executable checks, not a comparative performance benchmark.
The floating face has transparent background pixels with no enclosing panel or border. Individual controls remain readable against small backdrops. The dashboard’s Floating Echo switch opens/closes the window and follows manual close events. Off destroys the window and releases the voice session; on never starts microphone capture. WebGL is preferred, with an animated projection of the same 3D particles/morphs onto transparent canvas when WebGL2 is unavailable. The native preview retains its alpha channel; a viewer may display transparent pixels against black or a checkerboard.
Native tests use disposable API data, synthetic questions, retrieval/chat fixtures and isolated Electron profiles. They check real native TTS/ASR, memory-conditioned streamed replies, authentication/origin denial, workspace pinning, mid-speech cancellation, recovery and worker exit on parent-pipe EOF. Graphical checks load the real GLB, verify transparent PNG pixels, pin the window, start a local voice session and close it using the dashboard switch.
The portable build explicitly reads/writes source patches as UTF-8 (Windows’ default code page previously changed the patch fingerprint). Thread/batch limits respect CPU allocation and polling is disabled: an oversubscribed three-CPU M1 runner previously needed 138 seconds for 2.3 seconds of TTS; the corrected policy passed its native speech gate. Hosted Mac desktops lack WebGL2, which motivated the actual software 3D fallback. Hosted audio tests use a silent WebAudio sink so they exercise the graph without requiring physical speaker endpoints.
Local regressions passed: 310 Python tests, 53 browser scenarios and 19 Electron policy/lifecycle tests. The final startup-budget regression brings native Linux CI to 311 Python tests. The final audio startup change also passed the six voice browser cases, lint and production UI build. Documentation build/link checks and workflow lint passed. Generated UI output is excluded from the commits.
A Windows GUI test initially waited only for the 90-second native load budget plus a small margin. Diagnostic logs showed 20.59 seconds of preceding full asset verification, then successful native readiness after the test wait. The test now allows the complete startup/cleanup budget; production startup is bounded to 120 seconds including verification and reports an actionable timeout. The final native matrix above passed with this correction.
Remaining manual gates: physical microphone/output devices, acoustic echo and
room noise, actual local-chat-model voice latency, intelligibility/accent ratings,
interactive macOS TCC consent, oldest supported OS versions and signed/notarized
packaged installers. macOS graphical automation uses typed sessions and does not
bypass TCC; Windows/Linux use Chromium’s synthetic microphone. Linux GUI testing
uses --no-sandbox. These checks do not establish packaged sandbox behavior or
learned full-duplex speech reasoning. Windows ARM, Linux ARM voice and GPU speech
inference remain outside this pilot.
Visible first-time Echo setup (2026-10-24)
Section titled “Visible first-time Echo setup (2026-10-24)”ADR 0046 adds a prominent initial setup card, actual model byte progress, separate engine preparation, top-bar status across navigation and cancel/retry/tool guidance. Downloads require an explicit action; completion never opens the microphone. The floating face stays transparent with setup beneath it among the controls.
Executed locally on Linux/WSL2: 25 voice/setup Python checks, including a real owner-pipe EOF test with an actual descendant process; four new first-run browser scenarios and the six existing voice scenarios; lint and the production UI build; documentation build and workflow lint. Full workspace browser discovery passed 58 tests, including concurrent settings work outside this change. No real client profile or memory store was used.
The real disposable API/Electron smoke also passed. It invoked the managed
setup child against the already verified LFM cache, reached ready without new
downloads, then checked transparent head rendering, synthetic mic permission,
pinning and dashboard on/off session cleanup. Fresh byte downloads and cached
reuse use small hash-verified network fixtures in unit tests; first-run UI states
use API fixtures. This does not establish a fresh 1.07 GB UI-driven download or
fresh compiler installation on a user’s machine. Native Windows/macOS execution
of this new setup/cancellation path passed on source 1980545: the
native setup/speech/desktop run
passed Windows x64, Intel Mac, Apple Silicon and Linux x64, including 25 voice
checks and the real setup owner/descendant shutdown test. Each graphical job
also invoked the managed setup child against its verified native cache and
reached ready. The general CI
passed all five native backend targets, frontend and workflow checks. This
establishes cached setup and native process lifecycle, not a fresh full UI
download/build or real microphone/TCC validation.
Follow-up for the same-Chat route: Voice now forwards real chat install/download/ load progress without raw package logs, paths or repository metadata. A bounded first-time setup budget is separate from normal reply generation. A regression delays provisioning beyond the ordinary reply timeout, verifies actual byte events and privacy filtering, then completes the spoken reply. A browser case checks chat download percentage/bytes and rejection of late progress after interruption. This path does not benchmark or freshly provision the actual chat model; the existing chat provisioning policy remains in force. The follow-up passed 26 voice/setup Python checks and 11 voice/setup browser scenarios locally, plus the UI production build and lint.
Resource follow-up: the Windows virtual desktop intermittently reached the
model startup limit with two software-WebGL heads. Diagnostic verification took
23.03 seconds and native model warmup was still running at timeout. Recognized
software WebGL now uses a 10 fps cap to limit CPU rasterizer work; hardware WebGL
uses 30 fps and the canvas fallback 15 fps. The local real Electron smoke passed
with frameRateLimit: 10, cached managed setup and the active-session dashboard
shutdown check. Native graphical evidence records this cap and asserts it for
the test’s forced software-WebGL backend.
Final source 5536d39 passed the complete
native voice/setup/desktop matrix
on all four targets. Raw setup and desktop evidence
records ready/cached state, owned session shutdown, transparent PNG checks and
renderer limits: 10 fps software WebGL on Windows/Linux and 15 fps canvas on both
Mac architectures. Each target passed 26 voice/setup regressions, including real
owner/descendant termination. The Windows graphical run completed with the new
cap; its verification stage took 3.12 seconds on that runner. This is an observed
run, not a controlled performance comparison.
The general CI for 56ed4dd
also passed all five native backend targets, 321 Python tests and 58 browser
scenarios. The subsequent software-rendering fix passed the final frontend CI
and native graphical matrix above. No release or installer was published.
Anime Echo and desktop refinement (2026-10-24)
Section titled “Anime Echo and desktop refinement (2026-10-24)”Source f4d157f passed the complete native bundled-engine, speech and desktop
matrix.
General CI
also passed on Linux x64/ARM64, Windows x64 and both Mac architectures. The
evidence JSON retains engine
fingerprints, actual setup states, speech checks and desktop results.
| Voice target | Release engine | Real speech and cancellation | Fresh bundled setup, PATH empty | Native head/launcher and recall | Renderer in hosted GUI |
|---|---|---|---|---|---|
| Linux x64 | glibc 2.28 build | Passed | Passed | Passed | Software WebGL, 10 fps cap |
| Windows x64 | Native static MSVC build | Passed | Passed | Passed | Software WebGL, 10 fps cap |
| macOS ARM64 | Native macOS 13+ build | Passed | Passed | Passed | Textured canvas 3D, 15 fps cap |
| macOS x64 | Native macOS 13+ build | Passed | Passed | Passed | Textured canvas 3D, 15 fps cap |
Fresh GUI setup seeded only verified model weights, copied the shipped engine with PATH empty and reached ready without discovering CMake or a compiler. Each platform exercised real ASR/TTS, private worker authentication/browser-origin rejection, owner-pipe exit, interruption followed by a fresh turn, workspace binding and same-Chat routing with fixture reasoning and real speech synthesis.
Actual Electron windows passed whole-head dragging, saved bounds/recovery, registered recall shortcut, pinning, transparent PNG checks, compact layout, dashboard-toggle microphone/session teardown and the draggable launcher after the dashboard’s Minimize and Close controls. Mac microphone capture/TCC remains manual; Windows/Linux used synthetic input and a silent WebAudio sink. The WSLg local window manager did not emit a programmatic native minimize event, so the smoke uses the app’s real Minimize control; OS minimize-event routing is also covered by Electron fixtures.
For one synthetic question in each hosted run, first reply audio arrived in 2.56–3.79 s; cancellation acknowledgement took 32–110 ms. These are fixture results on CI machines, not a general latency or acoustic-quality guarantee. Physical global keypresses, Wayland behavior, real microphones/speakers/room echo, human intelligibility ratings and signed installer behavior remain manual gates. Full release packaging remains a main-only gate; the actual local Linux engine payload also passed disposable release-staging validation.
Local checks passed: 335 Python tests, 63 Playwright scenarios, 23 Electron fixtures, production UI build, lint and workflow checks. Browser cases cover setup/download/error/ready controls without scrolling at 400×640 and 320×420, chat provisioning with visible cancellation, transparent GPU-less rendering and launcher keyboard activation after dragging. Actual native companion preview.
The implementation fixes three observed integration defects. Exported engine payloads need 755 directories/executables and 644 data/notices so a container-built or system-owned installation is readable by the app user; private runtime caches retain their private modes. CPU projection must process only vertices used by each glTF primitive rather than repeatedly transforming a shared whole-head buffer, and must leave time after painting for input/audio. Finally, dashboard skip links, connection banners and overlays must not mount in floating routes: a focused “Skip to content” link intercepted clicks over the tiny launcher. Launcher tests wait for React readiness and asynchronous native position changes.
The head is adapted from pixiv’s explicitly CC0 beta Sendagaya Shino model, with Imprint modifications under Apache-2.0, a reproducible head-only glTF pipeline, mouth/blink expressions, holographic shading and fine animated wire contours. It is an adapted anime model, not an original sculpt or a licensed Haruhi asset.
Registered dashboard server and supervised restart (2026-10-24)
Section titled “Registered dashboard server and supervised restart (2026-10-24)”ADR 0050
follows a native Windows installer update from v0.20.0 to v0.21.0. The install’s
update-setup.log and imprint_ui.log show that Restart Manager shut down only
the portable executable’s stub, while the extracted desktop app and its
unregistered service kept serving v0.20.0 until a manual quit. These logs were
read only. No update or command was run against that installation.
Executed locally on Linux/WSL2: the full Python suite (335 tests, including
the real desktop service registering, unregistering and exiting with 75 after a
restart request), Go tests and vet (with Windows and macOS cross-vet), 22
Electron unit tests, dashboard type-check/lint and the full Playwright suite (59
scenarios, including reloading after the installer handover). The real CLI and
Python server were also run end to end from a disposable tree. imprint ui start → restart → status → stop replaced the server under the same
supervisor and left nothing behind. The real DesktopService was driven by
imprint ui status/restart/stop: it was reported, replaced without a failure,
then stopped with the app notified.
Executed natively on Windows through WSL interop: scripts/test-windows-setup.ps1
under Windows PowerShell 5.1, which fails against the previous setup script, and
the cross-compiled Go supervisor, restart and windowless-console tests.
Pending native runs: a real Inno Setup update between two releases, an
interactive installer upgrade over a running Imprint, the macOS .pkg handover,
and the packaged desktop app on each platform after imprint ui restart and
imprint ui stop.
Desktop microphone, relaunch and companion fixes (2026-10-25)
Section titled “Desktop microphone, relaunch and companion fixes (2026-10-25)”macOS: Enable microphone crashed the app. The published v0.22.1
imprint-darwin-arm64.tar.gz was inspected without running anything (its
checksum matches SHA256SUMS). bin/imprint-ui.app and its four helper apps
have no _CodeSignature/CodeResources. The main executable’s x86_64 slice has
no code signature, and its arm64 slice has only the linker’s ad-hoc signature
(identifier Electron, no Info.plist or resources binding, no entitlements, no
hardened runtime). NSMicrophoneUsageDescription is in Info.plist but not
sealed to the code. imprint ui open starts the app through open -a, so the
app is its own TCC-responsible process. ADR 0055
signs it ad hoc as a bundle, and release validation now rejects this artifact.
Pending on a Mac: a release built with the change, codesign --verify --deep --strict of the installed app, the TCC prompt itself, and the user’s crash
report (Termination Reason namespace) to confirm the diagnosis.
Relaunch without arguments. The desktop app asks the CLI beside it
(imprint ui runtime) when the OS starts it without imprint ui open’s
arguments. Covered by Go and Electron fixture tests. Pending native runs: macOS
Reopen after a crash and a Dock launch, a pinned Windows taskbar icon and an
AppImage started directly.
Floating companion. Typing before a conversation, drag handles limited to
the head, header and grip, recovery from a missed release, and pin state from
the main process are covered by Playwright specs that fail against the previous
component. acceptFirstMouse (macOS only) still needs a native check.
Windows: “Microphone unavailable. Check permissions”. Read-only evidence
from the reporting Windows install: the running v0.22.1 dashboard server serves
/audio/imprint-capture.js as text/javascript, but its log has no request for
that file in any desktop session. The ConsentStore\microphone\NonPackaged key
has no entry for Imprint.exe (Chrome and Discord have one). So getUserMedia
rejected before any device opened, and not with NotAllowedError (a request
handler refusal, PERMISSION_DENIED in Electron). The running shell was an
earlier build, extracted before the update: the v0.22.1 shell had yielded to it
through the single-instance lock. Its permission handlers are the same, and a
fixture confirms that both handlers grant audio to the voice page and the
companion on win32. The microphone failure now names the failed step
(device, capture worklet, audio graph) and the browser’s error name and message.
Only a refusal mentions permissions. The exact Windows cause still needs that
message from the user’s machine.
Executed locally on Linux/WSL2: release-validation unit tests (9, plus a run
against the extracted v0.22.1 bundle), Go cmd and internal tests, 34
Electron unit tests, dashboard type-check/lint and the full Playwright suite
(83 scenarios).
Secret redaction (2026-10-25)
Section titled “Secret redaction (2026-10-25)”ADR 0060; measurements in docs/evidence/2026-10-25-secret-redaction-cpu.json.
| Check | Result | Scope |
|---|---|---|
| Python unittest suite | Passed, 436 tests (1 skipped: the real-model smoke without its data directory) | Adds tests/test_redaction.py: rule formats and a false-positive corpus, idempotence, linear matching, version recognition, the setting, Privacy Filter with a stand-in model, every write path against an in-memory Qdrant (ingest, learn, MCP store/ingest_content, summaries, facts, sync import with re-embedding), scrub propagation across three workspaces standing in for devices (including differing Privacy Filter settings and a looser device re-indexing), redacted prompts for all six tagger and summarizer providers through stand-ins, imprint scrub and snapshot import. |
| Version queries against a real Qdrant 1.17.1 | Passed | A private server on a spare port: three workspaces, one scrub, the result reaching the other two through the import buffer, an unscrubbed copy skipped, the old text written again storing nothing. Exercises the full-text and keyword filters that the in-memory client only approximates. |
| Real Privacy Filter smoke, Linux x86_64 | Passed | Pinned q4f16 export from data/models/privacy-filter/, offline, ONNX Runtime 1.31 CPU: names and email kept, password and IBAN redacted, idempotent. |
| Real Privacy Filter, native Windows x64 | Passed | The installed runtime’s Python and onnxruntime-gpu 1.31 (CPU provider), from a temporary copy of imprint/ and a temporary data directory: first-use download and SHA-256 verification, then redaction and per-chunk timing. The installation’s config and data were not touched. |
go build, go vet ./cmd/, go test ./... |
Passed | imprint scrub and the import lock. In the first round, one cmd run failed transiently while other sessions held dashboard test ports; four reruns passed. |
Dashboard tsc --noEmit, ESLint on the Settings page |
Passed | The Redaction settings group. Not rendered in a browser. |
Not run: macOS (Intel macOS pins ONNX Runtime 1.23.2, whose support for the model’s QMoE kernel is unverified), Linux ARM, physical devices syncing over a relay, real tagger/summarizer provider endpoints, and the Commands page in a browser.
Voice port: microphone consent, grouped companion and per-look voices (2026-10-25)
Section titled “Voice port: microphone consent, grouped companion and per-look voices (2026-10-25)”Another session’s uncommitted voice work was ported onto the integration branch and merged with the desktop fixes above (ADR 0069, ADR 0070, ADR 0071).
| Check | Result | Notes |
|---|---|---|
node --test in ui-electron (43 tests) |
Passed | Consent answers per platform, scoped consent and settings IPC with the sender rechecked after consent, the grouped launcher and head, pin state while grouped, intended positions when native reports lag. |
imprint/ui/scripts/voice-audio.test.mjs (6 tests) |
Passed | Preferences recovery, consent answers, Echo’s robotic effect across chunks. |
Dashboard tsc --noEmit, ESLint, production build |
Passed | |
| Full Playwright suite (112 scenarios) | Passed | Settings panel and drag handles, per-platform refusal and recovery, pending consent dropped on Stop or a change of mind, remembered microphone and mode, session restart on a new look or model. One earlier run under heavy load had three voice failures that did not recur in the next runs, including three repeats of every voice scenario. |
| Python suite (553 tests, 1 skipped) | Passed | Includes tests/test_adr_records.py, the release validator’s microphone usage text check and the per-look voice tests. Run after rebasing onto the queue work (ADRs 0067 and 0068). |
Go vet and test ./... |
Passed | No Go changes. |
ui-electron/smoke-microphone.mjs, real Electron 45 under WSLg |
Passed | Disposable profile, synthetic devices, no fake permission prompt, --no-sandbox. |
ui-electron/smoke-companion-controls.mjs, real Electron 45 under WSLg |
Passed | Native select by keyboard, look picker, the real checkbox, a remembered synthetic capture on the next conversation, grouped drags from both windows. Software WebGL, --no-sandbox. |
| Headless Chromium screenshots | Taken | Voice page (light) at 1440 and 390 pixels wide, companion (dark glass) at 400×640 and 320×480, with and without settings open; no horizontal overflow and no companion page scrolling. |
Not run: the native voice workflow (it now runs both fixture smokes and the real-model smoke without the fake permission prompt on Windows, macOS and Linux), interactive macOS consent and recovery on Intel and Apple Silicon, Windows privacy toggles and hosted-runner privacy defaults, physical microphones and speakers, Linux portals and packaged sandboxing, grouped windows on native Windows and macOS desktops, and listening tests of the three voices, speaker consistency in the small model’s interleaved replies and the robotic effect.
Installed macOS microphone crash (2026-10-26)
Section titled “Installed macOS microphone crash (2026-10-26)”Apple Silicon macOS 26.6.2: the installed v0.25.0 .pkg wrapper has no
NSMicrophoneUsageDescription. The 10:28 crash report identifies TCC termination
for that missing key, while its nested Electron shell contains the key and passes
codesign --verify --deep --strict. The installer template now declares usage in
the enclosing app too; see ADR 0075.
Template plist lint and the metadata regression/ADR tests passed locally.
Interactive consent with a corrected installed package, physical capture and
Intel macOS remain untested. The installed app and real permission state were
left unchanged.
2026-10-26 — Conversation ingestion and default OCR
Section titled “2026-10-26 — Conversation ingestion and default OCR”On macOS arm64, reproduced the reported learn stop at conversation 1/167 from the local job log and traced the first 58,739-character exchange into full-model sentence-level ONNX inference during semantic chunking. The conversation path now chunks without model inference. With real cached Qwen embeddings and a disposable in-memory Qdrant, that exact transcript produced 11 chunks, completed in 113 seconds on the final CPU run, and published its completion watermark only after success. Chunk preparation took about 0.00014 seconds; the first persisted chunk appeared after about eight seconds. This is one transcript, not a throughput estimate for all 167.
Installed hashed base/CPU requirements in a disposable venv and read the expected text from a generated image and an image-only PDF using real RapidOCR/PDFium. Default OCR used wheel-bundled models and rendering libraries without system Tesseract or Poppler. The targeted Python suite passed 146 tests; an additional embedded-Qdrant interruption/resume regression passed separately. Go command/internal tests passed. Other release changes in this workspace have their own validation entries.
Native Windows, Linux and Intel macOS OCR execution, custom-language Tesseract execution and complete installers were not exercised. Wheel metadata checks required an Intel macOS OpenCV 4.11 pin to preserve the macOS 13 baseline. The installed application and real memory store were not patched or reindexed by these checks. See ADR 0076.
Setup frees the runtime before replacing its files (2026-10-26)
Section titled “Setup frees the runtime before replacing its files (2026-10-26)”See ADR 0084. Machine: RTX 4080 Laptop, Windows 11, plus WSL2 Ubuntu. Windows runs used a scratch tree under %TEMP% with an isolated USERPROFILE; the installed runtime was only read, apart from one uv cache prune on its cache that removed nothing.
| Check | Result | Notes |
|---|---|---|
| Field failure (installed Windows runtime) | Reproduced | Setup’s uv cache prune had removed every archive the fresh venv was linked to (15,626 files, 438 MiB), leaving loaded DLLs with one link; switching to GPU from Settings then failed with “Access is denied”. Prune on scratch caches with the same uv, locks and bootstrap kept every archive; the trigger was not reproduced. |
| Swap with a held, single-link runtime (native Windows) | Passed | The old install command failed exactly as in the field. imprint bootstrap then stopped the holding process, restarted an imprint ui start server, installed onnxruntime-gpu alone and passed the CUDA check in 12 s; the server came back under the same supervisor. |
| Settings switch back to CPU (native Windows) | Passed | PUT /api/config/model.device started bootstrap detached; it stopped a holding process, restarted the server that started it, installed the CPU build and removed the CUDA libraries, and the server came back with nothing pending. |
| Go tests natively on Windows | Passed | cmd (run with -test.v) and queuelock, including Python waiting while Go holds runtime.lock. |
Not run: the desktop app restarted by setup, the Windows installer, imprint update, macOS and an archive update.
The imprint command in WSL homes (2026-10-27)
Section titled “The imprint command in WSL homes (2026-10-27)”See ADR 0091. Machine: Windows 11 with WSL2 Ubuntu. Windows runs used a cross-compiled imprint.exe and the checkout’s imprint/ in %TEMP%, the installed venv’s Python reused read-only, disposable Linux homes and Windows data. No real client profile was registered.
| Check | Result | Notes |
|---|---|---|
| Linux symlinks seen from Windows | Measured | Through \\wsl.localhost, os.ReadFile of a valid absolute or relative Linux symlink reports the path missing; os.Lstat finds it as a non-regular file. |
| Go tests (Linux, and natively on Windows) | Passed | cmd WSL and cleanup tests: the command’s install, ownership, per-home release and removal on disconnect. Windows lacks the symlink privilege, so the symlink case logs and is skipped there. |
| Python bridge tests | Passed | The CLI refusal lists supported commands without bridge usage; the new test fails against the previous bridge. |
| Real WSL → native Windows smoke | Passed | scripts/test-wsl-interop.py: the command is installed, approves a Linux root and refuses update (exit 2). A Linux installation’s link survives setup and removal. A Windows-drive home gets and loses the command, and the command stays until the home’s last registration goes. MCP discovery found 19 tools. |
| Regression: ownership by reading the file | Reproduced | A build that checks with os.ReadFile alone replaced a Linux installation’s ~/.local/bin/imprint link with the bridge command; this change kept it and warned. |
Not run: an Inno Setup compile of the WSL page’s new description, the GUI installer, dashboard enrollment, and distributions other than Ubuntu.
Audio ingestion — 2026-10-28
Section titled “Audio ingestion — 2026-10-28”Implemented local file transcription with faster-whisper 1.2.1, CTranslate2 4.8.4 CPU/int8 and native PyAV decoding. The default model is revision-pinned Large v3 Turbo; multilingual Small is an explicit lighter choice. See audio ingestion and ADR 0096.
Executed on Linux x64 / WSL with Python 3.12:
- Checksum-verified model download/load and real English speech transcription using whisper.cpp’s public JFK WAV fixture.
- Real Romanian speech from Google FLEURS
ro_rotest file10014289053103326436.wav, with automaticrodetection and segment timestamps. - Both model choices executed. Large v3 Turbo improved the Romanian sentence, but still misrecognized a numeral. This is functional evidence, not an accuracy benchmark or a claim of exact transcription.
- A synthetic recording joining the English fixture and Romanian fixture across
the 30-second window boundary retained both languages and relative timestamps,
using
scripts/smoke-audio-ingest.pyand a disposable data directory. - Native bounded WAV, MP3, M4A and FLAC codec tests, including stereo 48 kHz to mono 16 kHz resampling; fixture storage tests for snapshot caching, failed replacement, forced retranscription and workspace isolation. The profile-refresh regression reuses vectors while updating transcription metadata when two models produce identical text.
- 79 targeted Python checks, 20 Chromium checks, dashboard production build, type checking, lint, runtime smoke and Go setup/runtime tests passed.
The CPU overlay’s CPython 3.12 wheel metadata covers existing Linux x64/arm64, Windows x64 and Mac Intel/ARM targets. Native Windows/macOS/Linux ARM execution and installer updates with this overlay have not been executed here. PyAV 15.1.0 retains a macOS 13 ARM wheel; that compatibility pin does not itself establish native execution. Mixed speech within one window, room noise, speaker diarization, multi-hour performance and video ingestion remain unvalidated or unimplemented as described in the audio guide.
Intel macOS removed (2026-10-29)
Section titled “Intel macOS removed (2026-10-29)”Intel Macs are no longer a supported platform
(ADR 0111). Earlier sections that
record Intel macOS results are kept as history; they no longer describe a target.
Releases, packages, voice engines, llama.cpp wheels, dependency pins and CI jobs
for darwin/amd64 are gone, and install.sh and imprint update refuse an Intel
Mac.
Executed on Linux x64: go vet ./..., go test ./... and the touched Python
tests (release validation, voice targets, downloads, ADR records). Not executed:
install.sh on an Intel Mac or under Rosetta, the arm64-only Electron build and
.pkg on the Apple silicon runner, and a full release run without the Intel jobs.