diff --git a/AGENTS.md b/AGENTS.md
index b10a789..a4a00f9 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -42,7 +42,9 @@ readiness without completed release gates and recorded evidence.
Keep running appropriate local checks and recording actual platform evidence.
- Agents own assigned paths and must coordinate shared interface changes. Do not commit other agents' unfinished work.
- Prepare indexes and the real Google query session in the background. Retain
- warmed readers and keep keyword search usable during setup. Measure startup,
+ warmed readers and keep keyword search usable during setup. Register prepared
+ graphs before SQL activation; retain the query model/LRU across publication
+ instead of repeating warmup under the foreground mutex. Measure startup,
actual first input, and warm p95 separately.
- UI should belong to each OS: native typography/chrome/dialogs, themes,
keyboard access, reduced motion and high contrast. Brief transitions must not
diff --git a/Cargo.lock b/Cargo.lock
index 65247f6..bd504df 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2247,6 +2247,7 @@ dependencies = [
"clap",
"futures-util",
"rmcp",
+ "rusqlite",
"searchi-assets",
"searchi-core",
"searchi-service",
diff --git a/SKILLS.md b/SKILLS.md
index adba8a6..0570e97 100644
--- a/SKILLS.md
+++ b/SKILLS.md
@@ -80,6 +80,17 @@ SEARCHI_TEST_FFMPEG and SEARCHI_TEST_FFPROBE. Run the actual Google integration:
cargo test -p searchi-service --test publication_google_cpu --test incremental_google_cpu --test google_cpu --locked -- --ignored --nocapture --test-threads=1
```
+Abrupt process recovery uses the same verified asset/helper variables:
+
+```sh
+cargo test -p searchi-cli --test crash_recovery --locked -- --ignored --nocapture --test-threads=1
+cargo test -p searchi-service --test prepared_google_cpu --locked -- --ignored --nocapture --test-threads=1
+```
+
+These tests use actual Google CPU inference. Crash tests terminate only their
+owned CLI process tree. Do not equate process termination with power-loss proof,
+or tiny prepared-reader timings with large-corpus/native UI performance.
+
Completed-group reuse must preserve actual vector bytes and remap current source
citations. Verify exact parser-input provenance and reject stale extraction before
encoding; legacy records require a normal rescan. Do not substitute simulated vectors or treat zero encoder calls as a
diff --git a/apps/desktop/src-tauri/resources/media-runtime/manifest.json b/apps/desktop/src-tauri/resources/media-runtime/manifest.json
index 74366a0..082dd42 100644
--- a/apps/desktop/src-tauri/resources/media-runtime/manifest.json
+++ b/apps/desktop/src-tauri/resources/media-runtime/manifest.json
@@ -3,9 +3,25 @@
"release": "autobuild-2026-10-12-13-12",
"version": "9.0.2-27-g7e93014c5b",
"platforms": {
- "windows-x86_64": {"archive": "ffmpeg-n9.0.2-27-g7e93014c5b-win64-lgpl-9.0.zip", "bytes": 171476229, "sha256": "104a019fe34c0747b208bde4842a0bac8b70a307cc2bb33aa4648fc15ddb2e39"},
- "windows-aarch64": {"archive": "ffmpeg-n9.0.2-27-g7e93014c5b-winarm64-lgpl-9.0.zip", "bytes": 118006941, "sha256": "68d3bac585b80b6f17e459eb4a203ed1f01b7635d4c611f1685de1ae65ca0987"},
- "linux-x86_64": {"archive": "ffmpeg-n9.0.2-27-g7e93014c5b-linux64-lgpl-9.0.tar.xz", "bytes": 137901812, "sha256": "12445b38a4700ba1ae7c9c7e57062f602c927dc4187555bfadc9f3e2f75f05b0"},
- "linux-aarch64": {"archive": "ffmpeg-n9.0.2-27-g7e93014c5b-linuxarm64-lgpl-9.0.tar.xz", "bytes": 117008524, "sha256": "c9160ae8440c17c016fb2f6b3fcce4bb9d633a15845e908b2303948a7724f227"}
+ "windows-x86_64": {
+ "archive": "ffmpeg-n9.0.2-27-g7e93014c5b-win64-lgpl-9.0.zip",
+ "bytes": 171476229,
+ "sha256": "104a019fe34c0747b208bde4842a0bac8b70a307cc2bb33aa4648fc15ddb2e39"
+ },
+ "windows-aarch64": {
+ "archive": "ffmpeg-n9.0.2-27-g7e93014c5b-winarm64-lgpl-9.0.zip",
+ "bytes": 118006941,
+ "sha256": "68d3bac585b80b6f17e459eb4a203ed1f01b7635d4c611f1685de1ae65ca0987"
+ },
+ "linux-x86_64": {
+ "archive": "ffmpeg-n9.0.2-27-g7e93014c5b-linux64-lgpl-9.0.tar.xz",
+ "bytes": 137901812,
+ "sha256": "12445b38a4700ba1ae7c9c7e57062f602c927dc4187555bfadc9f3e2f75f05b0"
+ },
+ "linux-aarch64": {
+ "archive": "ffmpeg-n9.0.2-27-g7e93014c5b-linuxarm64-lgpl-9.0.tar.xz",
+ "bytes": 117008524,
+ "sha256": "c9160ae8440c17c016fb2f6b3fcce4bb9d633a15845e908b2303948a7724f227"
+ }
}
}
diff --git a/apps/desktop/src-tauri/src/semantic_commands.rs b/apps/desktop/src-tauri/src/semantic_commands.rs
index 77cba1d..63d2e5d 100644
--- a/apps/desktop/src-tauri/src/semantic_commands.rs
+++ b/apps/desktop/src-tauri/src/semantic_commands.rs
@@ -25,6 +25,7 @@ pub struct SemanticState {
downloaded_bytes: AtomicU64,
error: Mutex