check / check (pull_request) Successful in 1m21s
On SIGINT/SIGTERM, RunOperation's OnStop hook only cancelled the running command and returned; nothing waited for its goroutine, so the process could exit before restore's cleanup defers ran. That left decrypted data in the temp directory: the blob cache (vaultik-blobcache-*) and the decrypted snapshot-database directory (vaultik-restore-*). StartOperation now returns a stop function that cancels the context and waits for the goroutine to return, bounded by the existing shutdownTimeout; OnStop calls it and warns if it times out. The fix is in the shared runner, so it covers every command, not only restore. Restore's chunk-write and blob-download loops also check the context between steps so the wait ends promptly. Model: opus-4-8