feat(runtime): preserve writers during ordinary watcher startup
Ordinary checkout startup previously had to use replacement-oriented MCP launch or promotion control, and a readable daemon did not prove that its watcher was active. Add startRuntimeWatcher(root, {expectedVersion, cliPath, runtimePath?, timeoutMs?}) and serve --mcp --path <root> --preserve-existing for startup that preserves existing writers.
The ordinary operation returns only after verifying the exact canonical root, build, active watcher, MCP status and unchanged daemon/writer ownership. Preservation covers initial connection, detached election, default and explicit project activation, fallback reads and reconnect. Live, legacy, uncertain, wrong-build, direct and promotion owners remain untouched. Timeouts leave a possibly shared daemon to its existing idle lifecycle.
Validation passed: 74 focused runtime-control, writer-lock and explicit-project lifecycle tests; the full engine/UI suite with 7,522 tests passed and 39 skipped across 587 files; TypeScript tsc --noEmit; kernel rules; agent-document size; whitespace. Reversing the writer-generation guard and disabling read-only fallback produced the intended successor-preservation and older -> older -> older failures. Both mutations were restored before the full suite. Lifecycle CI passed on Linux, Windows and macOS at this head.
README review covered the About this fork runtime-policy paragraph and embedding/runtime section. Language, framework and measured-result rows are unchanged. The API reference and Unreleased changelog describe the new operation. No installer, dependency, artifact promotion or installed-runtime change is included.