# v2.1.6

DVR 2.1.6 is a compatibility and network-hardening patch for the 2.1.x train. It advances exact stable validation to DSH `0.1.5-rc.2`, fixes the DSH 0.1.5 remote-settings startup error, and finishes the Host-first proxy convergence work without changing the public routing model, persisted settings schema, or minimum Host floor (`0.1.0-rc.8`).

## DSH 0.1.5-rc.2 and remote Settings

- Advances the fixed stable/exact Host evidence to DSH `0.1.5-rc.2`; exact `0.1.5-alpha.2` coverage remains preview verification evidence only. `0.1.5-rc.1` remains explicitly peer-compatible and the public DVR 2.1.x floor stays at `0.1.0-rc.8`.
- Fixes #465 by declaring `settings`, `connection`, and `webServer` on the same Cordis caller fiber that invokes `connection.rpc.handle()`. This prevents `cannot get property "webServer" without inject` under DSH 0.1.5 strict service-access semantics.
- Keeps the remote Settings security model unchanged: the RPC channel remains `trusted-host`, sensitive network/credential/local-device fields stay local-only, and the explicit remote field allow-list plus risk-confirmation flow remain authoritative.
- Keeps the separate Web-bundle `modules -> webServer` compatibility overlay in place while current upstream DSH still lacks that Loader activation dependency; #448 continues to track its eventual retirement.

## Host-first proxy convergence

- Makes the DSH/Host network path authoritative whenever Vision Router's `proxy` is blank. Ordinary Host traffic no longer passes through a second DVR proxy-routing decision.
- Keeps explicit `proxy` / `proxyHosts` as a supported, local-only Advanced override for visual traffic, including SOCKS5 and selective-host deployments that current DSH Host proxy policy cannot replace.
- Scopes Host-owned visual adapter overrides with AsyncLocalStorage, so concurrent same-origin Host requests do not inherit DVR proxy state. Vision chain, `vision_describe`, Benchmark, and Exact Check share the same scoped authority.
- Gives Router-owned and scoped Host-owned ProxyAgents one shared lease/retire lifecycle. Hot proxy replacement, clearing configuration, pending construction, synchronous failures, and plugin unload now retire Agents without leaking or closing in-flight work.
- Enforces `proxyHosts` on every redirect hop after the initial request is admitted. Redirects that leave the allow-list return to the request-start Host/caller dispatcher while Fetch/Undici remains responsible for redirect semantics, body replay, header stripping, limits, and abort behavior.
- Preserves historical `socks5h://` settings without rewriting persisted configuration: the compatibility projection to Undici-native `socks5://` happens only after a request is admitted by `proxyHosts`.
- Removes the obsolete process-wide dispatcher tracker/global-fetch observer after lifecycle ownership moved to the shared dispatcher pool.

## Protocol and regression coverage

- Adds real loopback HTTP CONNECT and SOCKS5 protocol tests in addition to MockAgent/FakeProxyAgent coverage. The SOCKS case verifies proxy-side DNS by sending an unresolved domain name through the SOCKS5 tunnel.
- Exact-source stable/preview contracts continue to run on Ubuntu, macOS, and Windows; Node 22/24 CI, routing parity, adversarial fuzzing, dependency review, CodeQL, native multimodal cold resume, Windows screenshot runtime, and host-sharp integration remain release gates.
- Pre-release acceptance on macOS used the actual `npm pack` tarball installed through DSH `0.1.5-rc.2`, then exercised the real Chromium Settings UI, a settings write/readback round trip, cold Web restart, and a real headless vision turn. `vision_ocr`, `vision_describe`, and `vision_colors` correctly read a generated image using the machine's normal DSH model credentials.

## Upgrade

Upgrade to 2.1.6 and restart DSH Web/Desktop. Existing 2.1.x settings remain compatible; no migration is required.
