On Windows, otto update v1.0.7 → v1.1.0 logged EPERM cleanup warnings
against duckdb.dll, sharp.dll, and otto_engine.win32-x64.node because the
running otto.exe held DLL handles. Install succeeded but left orphan
.otto-* staging dirs under %APPDATA%\npm\node_modules\@cmetech\.
The fix: on Windows, otto update spawns a detached PowerShell bootstrap
in a visible "OTTO Updater" console window. The bootstrap waits for the
parent otto.exe pid to exit (max 30s) so DLL handles release, runs the
install cleanly, sweeps orphan staging dirs, and writes completion status
to ~/.otto/agent/update-status.json. The next otto update surfaces that
status so users can see whether a background update finished.
POSIX behavior unchanged — inode semantics handle live-process replacement.
8 new tests for buildWindowsBootstrapScript: pid wait loop, status path
encoding, install command pass-through, orphan dir sweep, bun support,
single-quote escaping, keypress-to-close, success messaging.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>