# Official-first review: DSH 0.2.0-rc.1

> **Historical review:** this preserves the earlier evaluation, not current
> support or delivery readiness. Use the [rc.2 review](./official-first-020-rc2.md)
> and current README for the supported host.

## Target and evidence boundary

Candidate plugin **`0.4.0-alpha.38`** adds official Core **`0.2.0-rc.1`**, tag commit [`4878cdabd87d4041bdaff61d04c966883b9fd07a`](https://github.com/deepseek-ai/deepseek-harness/commit/4878cdabd87d4041bdaff61d04c966883b9fd07a), as the current target while retaining every earlier compatibility pin. The independently observed Windows Desktop feed also identifies `0.2.0-rc.1`; its Desktop package set is not materialized in this checkout. Source/API qualification, npm package fixtures, and Desktop installation/runtime qualification are separate evidence.

This review inspected only the exact official tag and unchanged installed package artifacts. **Complete** means the cited public contract supports the named behavior, not that Desktop or a live service was qualified. **Partial** identifies both the official capability and the gap. **Unverified** means parity was not established, not that official support is absent. Decisions are **retain**, **migrate**, or **retire**. A retirement trigger is evidence for a separately reviewed change, never permission for automatic removal on a version bump.

## Compatibility decisions

| Surface | Exact official contract and support | Decision | Remaining gap / retirement trigger |
|---|---|---|---|
| Copilot OAuth, credentials, catalog and ordinary model transport | The unchanged official [`llm-pi-ai` login/auth exports](https://github.com/deepseek-ai/deepseek-harness/tree/4878cdabd87d4041bdaff61d04c966883b9fd07a/packages/llm/llm-pi-ai/src) continue to own provider registration, OAuth grants, refresh and normal transport. | **Retain** the narrow public credential bridge and account-scoped route; do not add a second adapter or catalog. | The official path does not establish the companion's strict grant normalization, conditional authorization bootstrap, or authenticated per-account endpoint/capability metadata. Retire those bridges only after public official behavior and runtime acceptance preserve the same data and safety contracts. |
| Core settings access and invalidation | [`SettingsForms`](https://github.com/deepseek-ai/deepseek-harness/blob/4878cdabd87d4041bdaff61d04c966883b9fd07a/packages/settings/settings/src/index.ts) and its public [types](https://github.com/deepseek-ai/deepseek-harness/blob/4878cdabd87d4041bdaff61d04c966883b9fd07a/packages/settings/settings/src/types.ts) expose current descriptor/mutation APIs and the `settings/document-updated` event. | **Migrate** readers to the public descriptor path where legacy `get` is absent; **retain** a narrow legacy branch for older supported releases. | Retire the compatibility reader/listener only when the corresponding older Core pins are removed through an explicit support-policy change and the current namespace/redaction guarantees remain intact. |
| Volatile provider configuration | The public [`PiAiConfig` provider view](https://github.com/deepseek-ai/deepseek-harness/blob/4878cdabd87d4041bdaff61d04c966883b9fd07a/packages/llm/llm-pi-ai/src/config.ts) wraps provider storage; callers materialize it through `.get()` rather than object indexing. | **Migrate** the plugin's route builder to `.get()` and **retain** object support for older native layouts. | Do not infer registration from an empty volatile wrapper. Retire the legacy object branch only with removal of the older baselines and matching fixture evidence. |
| Tool results and message history | The current [`Message` contract](https://github.com/deepseek-ai/deepseek-harness/blob/4878cdabd87d4041bdaff61d04c966883b9fd07a/packages/llm/llm/src/message.ts) includes first-class `role: 'tool'` messages; older history can still contain nested tool-result blocks. | **Migrate** serialization to recognize both current and retained forms without rewriting source history. | Do not collapse tool messages into assistant text or change replay ownership. Retire legacy handling only after old stored histories are outside the declared support scope. |
| Agent creation and existing role-history restoration | The public [Agent lifecycle](https://github.com/deepseek-ai/deepseek-harness/blob/4878cdabd87d4041bdaff61d04c966883b9fd07a/packages/core/agent/src/index.ts) serializes and awaits `agent/created`; the event carries a creation source. | **Retain** compatibility-only projection restoration and test it through the awaited public lifecycle. | Retired role UI/settings/new-root behavior stays retired. Runtime policy enforcement and old-history recovery remain plugin-owned; never infer permission from a missing or malformed descriptor. |
| Remote and Client Gateway validation | Current [Typert codecs](https://github.com/deepseek-ai/deepseek-harness/blob/4878cdabd87d4041bdaff61d04c966883b9fd07a/packages/typert/protocol/src/types.ts) expose `create()` factories. The [Client Gateway](https://github.com/deepseek-ai/deepseek-harness/blob/4878cdabd87d4041bdaff61d04c966883b9fd07a/packages/api/gateway/src/client/index.ts) forwards parameter payloads without local parsing; strict input validation belongs at the registered Host boundary. Strict result codecs decode only when the descriptor publishes a decoder. | **Migrate** descriptor tests to current `create()` factories; **retain** the same strict Host codecs and legacy `.schema` helper bridge. | Client-side tests must not claim pre-transport input filtering or result validation the current Gateway does not promise. The exact-source Host fixture must continue to prove strict registered-boundary parsing. Retire the legacy bridge only after old Core consumers leave support. |
| Models UI and additive contribution | The official [Models Client](https://github.com/deepseek-ai/deepseek-harness/blob/4878cdabd87d4041bdaff61d04c966883b9fd07a/packages/client/ui-settings-models/src/client/index.ts) declares keyed `settings.models.provider-card` and list `settings.models.footer` slots. | **Retain** additive account/search controls and native model editing. | Slot existence is not account-management or search-policy parity. Retire a control only after equivalent official workflow, accessibility, ownership and lifecycle behavior pass Client/Desktop acceptance. |
| Web routing and search | Official Web exposes registered provider dispatch; the plugin's public facade captures an exact registered provider before routed search. | **Retain** fail-closed captured-registration dispatch and the explicit missing-seam diagnostic. | Never replace captured identity with an ID-only lookup, global model default or another Session's selection. Desktop/runtime and live provider behavior remain unverified. |
| Plugin installation and Desktop injection | The official Windows Desktop feed identifies release `0.2.0-rc.1`, but no installed Desktop package set or loaded runtime is present here. | **Retain** package entry-point/peer checks and document the independent Desktop boundary. | Do not claim successful injection, install, activation, authentication, model calls or UI behavior from Core source or npm package tests alone. |

## Qualification ledger

- The release/tag and public source contracts above are pinned; the Core tree and installed dependencies were not modified.
- Local source build, focused tests, repository verifiers, exact-tag runtime fixtures and the complete gate must be reported separately after execution. Package-version metadata is not semantic or runtime proof.
- No real Copilot OAuth, model, search, live-profile change, Desktop install/restart, publication, push or pull request is part of this adaptation.
- Desktop package hashes/contents, packaged Electron activation, and loaded-version equivalence are **not verified** in this checkout. The observed feed release is not a materialized Desktop artifact.
