# Linux speech client portability check 2026-10-13, Ubuntu 24.04 WSL x86-64. Immutable source snapshot from commit `9bc7221`; existing isolated Cargo cache and target, locked offline dependencies. `SEARCHI_FORCE_CPU=1` throughout. No model inference or GPU execution occurred. Executed checks: ```sh cargo test -p searchi-speech --locked --offline cargo check -p searchi-cli --locked --offline SEARCHI_TEST_PYTHON=python3 cargo test -p searchi-speech actual_subprocess_timeout_and_overflow_are_reaped --locked --offline -- --ignored --nocapture ``` Five default unit tests passed. The real owned-subprocess transport test also passed: timeout and oversized framing reaped their child processes; only the typed transport failure was eligible for recovery. The genuine native speech model test remained ignored. CLI compilation passed, including the shared speech/service/assets dependencies, without desktop dependencies. Recorded command output: speech compilation 11.67 seconds; headless dependency check 7.28 seconds; real transport test 0.14 seconds. These are build/test durations, not inference or search performance measurements. Snapshot: `/home/karl/.cache/searchi-validation/linux-source-9bc7221`. This closes a client portability check only. It does not prove the Linux native speech worker, model setup, runtime packaging, recognition quality, desktop UI or GPU operation. Published Linux downloads remain version 0.1.4. ## Native runtime preparation A normal auto runtime diagnostic build from that immutable snapshot was started in `/home/karl/.cache/searchi-validation/speech-auto-016`. It included Vulkan compilation and no GPU inference. It was deliberately cancelled after inspection confirmed that it predates the relocation correction, rather than due to a wait timeout. The exact owned builder command line was verified before terminating its process tree; its original tool session then reported terminal exit 1. No runtime from that incomplete build is releasable. Inspection exposed an unverified release path: speech packaging flattened shared libraries without checking ELF dependency closure or their build-tree lookup paths. The builder now checks every staged ELF for origin-only RUNPATH and declared dependencies, allowing a system Vulkan loader only for the dynamic Vulkan module. Three builder tests passed, including rejection of build-tree paths, missing libraries and a Vulkan dependency on the CPU worker. The CMake configuration now gives Linux shared targets their own `$ORIGIN` RUNPATH; this is required because executable RUNPATH is not transitive. Actual configuration and a separate native `ggml-base` build passed in `speech-rpath-check-016`. `readelf` verified that the resulting library has RUNPATH `$ORIGIN`; generated executable link flags use the same path. This narrow library check does not establish complete runtime relocation. The original snapshot does not contain this correction. Its output must not be released as corrected evidence. A corrected normal auto build from immutable commit `61afa08` is now running in `/home/karl/.cache/searchi-validation/speech-auto-61afa08`. Next: wait for its terminal result, inspect the complete ELF closure, then validate the runtime outside the build tree with `LD_LIBRARY_PATH` unset and forced CPU recognition. Linux staging now invokes the same ELF closure verification after manifest, architecture and CPU/acceleration checks. A valid inventory cannot bypass this check; missing `readelf` also fails staging. Six targeted staging tests passed, including inspected ELF coverage, failure propagation and Windows independence. The same six tests subsequently passed directly on Ubuntu 24.04 (0.409 seconds). The upcoming real CPU test fixture was prepared from the unchanged verified English WAV (source SHA-256 `0aa1fa97d367d987bfb3bb01d7eca11db77a544552ccb8dc0a78ad74d0b496ea`). Exact mono 16-kHz signed PCM16 samples were converted to float32 by division by 32768, preserving all 360192 samples. PCM SHA-256: `56948226ac5a0ad4b70523a856dad0851929c7067957f339e9a5b30fc9b369ce`. Fixture preparation succeeded; native recognition has not yet been executed. ## Headless release preparation The locked offline Linux release build of `searchi-cli` and `searchi-extract-worker` from source `61afa08` passed in 58.38 seconds. The extraction helper was staged with its current source fingerprint and verified. CLI executable: 21921224 bytes, SHA-256 `f7602d41eeab80c74e00014ab51297223eae651755707b341951c2e624807d94`. This is compilation and provenance evidence, not a new published archive. `tools/package_linux.py --speech-runtime PATH` now includes a verified normal speech runtime in its isolated `speech-runtime/` directory. The worker is executable; inventory, libraries and approved notices are included. Archive instructions explain speech-model setup and indexing, and metadata identifies speech as experimental. Omitting this parameter preserves reproduction of older speech-free packages. New speech-enabled releases must provide it. Twenty-one focused package tests passed, including archive hashes/permissions, instructions, and rejection of internal CPU artifacts, tampering, absent notices and invalid ELF closure while preserving an existing output. These use fixture artifacts and do not replace the pending genuine native-runtime verification.