Shared recorder ownership and local IPC
Decision: retain app.cassette.desktop, the existing SQLite library and native recorder. An explicit CASSETTE_HOME overrides the complete runtime root for isolated qualification; default Tauri app_data_dir is unchanged. Canonicalize before taking one OS file lock per root.
The GUI either owns the runtime or attaches to its existing owner. cassette-cli starts the same desktop executable in broker-only mode when needed. Broker-only processes exit after an idle timeout; capture/jobs keep them alive. There is no MCP service. File IPC stays beneath the canonical root, accepts a strict command enum and UUID filenames, limits payload size, atomically publishes files, checks schema/owner/request IDs and bounded deadlines, and never launches arbitrary commands. Windows payloads use per-user DPAPI; request-only provider keys never enter plaintext spool files. Request status never restarts or recovers a capture implicitly.
Capture remains in a crash-safe temporary WAV. Pending name/title/tags/folder metadata is stored separately and updated without reopening the microphone. Stop publishes an immutable destination WAV without replacing an existing file, imports it into the existing library, and only then cleans capture recovery material. Failed saves retain original temporary audio and plain errors. CLI, GUI, tray and shortcuts share these operations.
Frontend additions are backward compatible: CaptureMetadata filename?/destination?; CaptureStatus optional nullable pendingFilename/destination/fullPath/freeBytes/remainingSeconds/savedPath; saving/saved states; updateCaptureMetadata(patch), recordingSettings(), saveRecordingSettings({defaultDestination}), chooseDestination(), openFolder(path). Browser preview remains a separate synthetic capability surface and makes no native-folder claim.
Qualification requires synthetic collision/failure/owner-lock/correlated-response tests, copied-library tests, frontend builds and a Windows installer. Actual microphone/long capture/upgrade acceptance remains separate from code-test success.