dsh-github-copilot 0.4.0-alpha.24 → 0.4.0-alpha.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/AGENTS.md CHANGED
@@ -29,7 +29,7 @@ Use native DSH tools for goals, background jobs and scoped subagents. Use local
29
29
 
30
30
  ## Product and architecture
31
31
 
32
- `dsh-github-copilot` is a companion to official DSH `0.1.6-alpha.1`, DSH `0.1.5-rc.2`, DSH `0.1.5-rc.1`, DSH `0.1.5-alpha.2`, DSH `0.1.5-alpha.1`, DSH `0.1.3-alpha.1`, DSH `0.1.2-rc.1`, and the controlled DSH Desktop `0.1.1-rc.2` Core baseline. It does not own a general Copilot chat adapter. DSH's built-in `llm-pi-ai` mount owns the GitHub Copilot provider, catalog, OAuth method and grant format, token exchange, refresh, and normal model transport.
32
+ `dsh-github-copilot` is a companion targeting official DSH `0.1.6-alpha.2`, with retained baselines for DSH `0.1.6-alpha.1`, DSH `0.1.5-rc.2`, DSH `0.1.5-rc.1`, DSH `0.1.5-alpha.2`, DSH `0.1.5-alpha.1`, DSH `0.1.3-alpha.1`, DSH `0.1.2-rc.1`, and the controlled DSH Desktop `0.1.1-rc.2` Core baseline. It does not own a general Copilot chat adapter. DSH's built-in `llm-pi-ai` mount owns the GitHub Copilot provider, catalog, OAuth method and grant format, token exchange, refresh, and normal model transport.
33
33
 
34
34
  This repository owns nine narrow surfaces:
35
35
 
@@ -47,6 +47,8 @@ This repository owns nine narrow surfaces:
47
47
 
48
48
  `src/dual-model-host.ts`, `dual-model-types.ts`, `dual-model-remote.ts`, `dual-model-card.ts` and `dual-model-ui.ts` own this optional flow; see `docs/dual-model.md`. The three role Remotes use a separate namespace and strict codecs; the eight existing authorization/migration descriptors retain their original contracts. Policy is captured once per explicitly created root and restored through a namespaced projection. Account discovery and the native adapter remain the only model/auth owners. Dedicated tool restrictions are workflow controls, not a sandbox against shell code. Missing public seams must disable only this feature, never require a Core patch. A failed recovery of an existing create is uncertain: keep its request UUID unless Host evidence explicitly establishes not-created. Do not use `session.selectModel` to initialize roles because it also changes the future global default; the creation seed uses the existing session-local event format. Ordinary user model-picker actions remain Core-owned.
49
49
 
50
+ Alpha.25 admits native `subagent/descriptor` v3, already v3 in the retained rc.1 baseline; the old v1 assumption was a plugin/test bug. Projection cache `stateVersion: 2` forces refolding, not history conversion. Unknown/v1/v2 or invalid child descriptors fail closed unmodified; review the original child's work and explicitly create a new child if needed, never relabel or fabricate a descriptor. Strict Remote codecs provide alpha.2 `create()` factories and retain the legacy `schema` bridge to the same strict parser, with no `src-json` downgrade.
51
+
50
52
  ## File map
51
53
 
52
54
  - `src/index.ts`: authorization bootstrap, dependency-gated Host entry, settings registration, listener, and `ctx.web` provider composition.
@@ -108,7 +110,7 @@ This repository owns nine narrow surfaces:
108
110
 
109
111
  ## Supported DSH seams
110
112
 
111
- The supported upstream baselines are:
113
+ The retained upstream baselines and current qualification target are:
112
114
 
113
115
  - Desktop `0.1.1-rc.2` with controlled Core commit `a772dbbde82780bff2b9394427e9f0a24cafa1d5`
114
116
  on `cloga-pi-ai-model-api`, based on tag commit `b150a551b8d465e31e418e1b2eaf5e79bbb7d28e`.
@@ -119,12 +121,13 @@ The supported upstream baselines are:
119
121
  - Official tag `dsh-v0.1.5-rc.1`, commit `183f08e9c6dde7e36cd2318eaee70b0da08fb35e`.
120
122
  - Official tag `dsh-v0.1.5-rc.2`, commit `fb2c4b9e698e30edb738bca4cf0618587db7d203`.
121
123
  - Official tag `dsh-v0.1.6-alpha.1`, commit `0a15e36e7f82b6ed45af6fa9759f29b40dcd965d`.
124
+ - Official tag `dsh-v0.1.6-alpha.2`, commit `ddefc45fbc7f8e46dd73185e68295696d1297887`.
122
125
 
123
- The current target is official `0.1.6-alpha.1`; retain all seven earlier pins and exact `0.1.2-rc.1` development dependencies. All six tagged-source targets use unchanged tagged-source runtime fixtures, not standalone npm-artifact certification. The 0.1.6 fixture must await serialized `agent/created`, avoid new synchronous Session-history reads, and verify MCP resource cursors, PTC/workflow names, cancellable Sandbox/Shell preparation, optional-plugin startup policy, attachment cache separation, durable `IMAGE_OFFLOAD_REQUIRED` projection/retry and Team pagination without taking ownership of those services. Compatibility metadata and synthetic tests do not prove live endpoints, installed Desktop bytes, release publication or loaded runtime state. Public Host, Client and Remote seams remain available; this baseline update does not authorize implementation rewrites.
126
+ The current qualification target is official `0.1.6-alpha.2`; retain all eight earlier pins (nine total) and exact `0.1.2-rc.1` development dependencies. All seven tagged-source targets use unchanged tagged-source runtime fixtures, not standalone npm-artifact certification. The 0.1.6 fixture must await serialized `agent/created`, avoid new synchronous Session-history reads, and verify MCP resource cursors, PTC/workflow names, cancellable Sandbox/Shell preparation, optional-plugin startup policy, attachment cache separation, durable `IMAGE_OFFLOAD_REQUIRED` projection/retry and Team pagination without taking ownership of those services. Compatibility metadata and synthetic tests do not prove live endpoints, installed Desktop bytes, release publication or loaded runtime state. Public Host, Client and Remote seams remain available; this baseline update does not authorize implementation rewrites.
124
127
 
125
128
  These pins document compatibility evidence. They do not authorize creating another controlled Core patch or making one a prerequisite for new plugin fixes.
126
129
 
127
- - Models UI: `0.1.2-rc.1`, `0.1.3-alpha.1`, `0.1.5-alpha.1`, `0.1.5-alpha.2`, `0.1.5-rc.1`, `0.1.5-rc.2` and `0.1.6-alpha.1` use `settings.models.provider-card`, keyed by settings namespace `llm-pi-ai`, to embed login/status/Refresh/Manage in a mounted configured canonical `github-copilot` row and suppress the separate footer controller. With no such row mounted, retain footer fallback; rc.2 uses a dedicated `settings.section`. Preserve the shared account-state owner across transfer only while another eligible surface remains mounted. Unmounting the last surface or replacing declarations without overlapping mounts stops polling; a later controller reads status and separately non-forcing ensures missing/idle/stale/error/loading signed-in metadata, without replaying the old forced-login action. Manual Refresh models lives inside Manage; errors expose Retry. Opening Models is no longer guaranteed network-free, but status/details themselves remain pure. This additive slot cannot replace Core Edit/Delete: retain the native editor, while normal plugin discovery needs no manual model definitions. UI integration must not merge/remove actual canonical and `github-copilot-preview` routes or rewrite credentials, configuration, history or selection.
130
+ - Models UI: `0.1.2-rc.1`, `0.1.3-alpha.1`, `0.1.5-alpha.1`, `0.1.5-alpha.2`, `0.1.5-rc.1`, `0.1.5-rc.2`, `0.1.6-alpha.1` and `0.1.6-alpha.2` expose `settings.models.provider-card`, keyed by settings namespace `llm-pi-ai`, to embed login/status/Refresh/Manage in a mounted configured canonical `github-copilot` row and suppress the separate footer controller. With no such row mounted, retain footer fallback; rc.2 uses a dedicated `settings.section`. Preserve the shared account-state owner across transfer only while another eligible surface remains mounted. Unmounting the last surface or replacing declarations without overlapping mounts stops polling; a later controller reads status and separately non-forcing ensures missing/idle/stale/error/loading signed-in metadata, without replaying the old forced-login action. Manual Refresh models lives inside Manage; errors expose Retry. Opening Models is no longer guaranteed network-free, but status/details themselves remain pure. This additive slot cannot replace Core Edit/Delete: retain the native editor, while normal plugin discovery needs no manual model definitions. UI integration must not merge/remove actual canonical and `github-copilot-preview` routes or rewrite credentials, configuration, history or selection.
128
131
  - Authorization flow key: `llm-pi-ai/github-copilot`.
129
132
  - Authorization service: rc.1 Core provides it; the rc.2 web/headless profiles rely on this package's runtime dependency and conditional bootstrap.
130
133
  - Credentials: use record description/read/modify/delete APIs on the Host. Never read records in the browser.
@@ -136,7 +139,9 @@ These pins document compatibility evidence. They do not authorize creating anoth
136
139
  - Provider headers: rc.1 validates configured headers through Fetch and reuses Host-owned headers during model discovery.
137
140
  - Remote results: the seven ordinary authorization methods retain the Zod v4 `GitHubCopilotAuthorizationView` strict codec required by rc.2 and accepted by rc.1. The eighth no-argument `migrationStatus()` method has a separate strict `GitHubCopilotMigrationStatus` codec; it does not change the ordinary auth contract.
138
141
 
139
- When upgrading DSH or pi-ai, inspect the exact tagged public exports and update the baseline, compatibility guard, tests, and docs together.
142
+ When upgrading DSH or pi-ai, inspect the exact tagged public exports and update the baseline, compatibility guard, tests, and docs together. Apply the **official-first policy**: compare each customization's purpose against exact official source/contracts, classify complete/partial/unverified support, choose retain/migrate/retire, and record the remaining gap plus a concrete retirement trigger. Unverified parity is not evidence of absence. Prefer official behavior only after configuration/data migration, safety and runtime acceptance are reviewed; remove redundant paths and their obsolete tests without losing user-visible acceptance coverage. The current comparison is [official-first alpha.2](./docs/official-first-016-alpha2.md).
143
+
144
+ For alpha.25, source markers, local rc.1-backed focused tests and fifteen scoped exact-source runtime tests passed (alpha.2 contracts 8, Remote 1 and Session-context 6). Full local `pnpm verify` passed: 1373 Vitest tests with 2 expected skips, 176 tooling tests, typechecks, build and package smoke; pack/tarball verification passed. The scoped tests use a supplemental resolver with official TypeScript `6.0.3`, declared `mime-types@3.0.2` and `ws@8.21.0`, and shared Zod `^4.4.3`, without source/dependency patches, not the full official-root-helper closure. Broad frozen dependency installation is blocked by the configured mirror's HTTP 404 for `node-addon-require-builtin@0.1.6`, and candidate CI qualification has not executed. Keep these limits separate from live Desktop, published-artifact, OAuth and model-call compatibility; none is claimed.
140
145
 
141
146
  ## Code and documentation conventions
142
147
 
@@ -191,7 +196,7 @@ Then run `pnpm verify:tarball -- artifacts/dsh-github-copilot-<package-version>.
191
196
 
192
197
  `pnpm verify` checks the Agent contract, source and local test types, baseline markers, a clean build, Vitest tests, Node tooling tests, and real built Host import/Client-loader/Remote smoke. `tests/fixtures` are intentionally excluded from local test typecheck because they import source from a separate pinned Core checkout. The checked-in code must pass; never suppress compiler errors or weaken a test to get a green report.
193
198
 
194
- CI runs on Windows/Linux against all eight exact Core baselines, with unchanged tagged-source runtime checks for `0.1.3-alpha.1`, `0.1.5-alpha.1`, `0.1.5-alpha.2`, `0.1.5-rc.1`, `0.1.5-rc.2` and `0.1.6-alpha.1`. Optional native Chat fixtures also cover all six tagged-source targets and `0.1.2-rc.1`. `verify:upstream` is static seam-marker evidence. `verify:controlled-core` exclusively installs a temporary config fixture, refuses an existing target, and removes only its own file; it is not full plugin activation. The published rc.2 adapter test covers model materialization, not live provider transport. The release job must wait for the complete reusable CI matrix on the tagged revision, then verify its own packed bytes before publishing.
199
+ The CI definition targets Windows/Linux against all nine exact Core baselines, with unchanged tagged-source runtime checks for all seven tagged-source targets: `0.1.3-alpha.1`, `0.1.5-alpha.1`, `0.1.5-alpha.2`, `0.1.5-rc.1`, `0.1.5-rc.2`, `0.1.6-alpha.1` and `0.1.6-alpha.2`. Optional native Chat fixtures also cover all seven tagged-source targets and `0.1.2-rc.1`. This is a required gate, not evidence that alpha.25 qualification has executed. `verify:upstream` is static seam-marker evidence. `verify:controlled-core` exclusively installs a temporary config fixture, refuses an existing target, and removes only its own file; it is not full plugin activation. The published rc.2 adapter test covers model materialization, not live provider transport. The release job must wait for the complete reusable CI matrix on the tagged revision, then verify its own packed bytes before publishing.
195
200
 
196
201
  ### Evidence and side effects
197
202
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.0-alpha.26 (prepared)
4
+
5
+ - Fix low-contrast native dropdown options in dark mode for planning/execution models, workspaces and search providers (#142).
6
+ - Pair opaque application-theme surfaces with primary or secondary foreground tokens on both selects and options, with readable system-color fallbacks on hosts without those tokens.
7
+ - Preserve disabled/unavailable choices and all selection, CAS and session behavior. Add focused regressions and remove fixture-only option colors that masked the production bug; no Core or dependency changes are required.
8
+
9
+ ## 0.4.0-alpha.25 (candidate)
10
+
11
+ - Append the ninth exact official target `dsh-v0.1.6-alpha.2` at `ddefc45fbc7f8e46dd73185e68295696d1297887`, retaining all older pins and exact `0.1.2-rc.1` development dependencies.
12
+ - Supply strict Remote `create()` factories with a legacy `schema` bridge over the same parser; preserve endpoint contracts and validation rather than weakening to `src-json`.
13
+ - Correct dedicated executor projection admission to native `subagent/descriptor` v3. Native descriptors were already v3 in rc.1; the plugin's old v1 assumption was a bug, not an upstream format migration.
14
+ - Bump the plugin projection cache to `stateVersion: 2` to force refolding. Unknown/v1/v2 descriptor histories fail closed and remain unmodified; recovery requires a reviewed new child, never relabeling or fabricated conversion.
15
+ - Add strict-codec, descriptor/projection and exact-alpha.2 contract fixtures, plus an [official-first comparison and retirement plan](./docs/official-first-016-alpha2.md) for retained custom surfaces.
16
+ - Evidence remains limited: source markers, local rc.1-backed focused tests and fifteen scoped exact-source runtime tests passed (alpha.2 contracts 8, Remote 1 and Session-context 6; supplemental resolver with official TypeScript `6.0.3`, declared `mime-types@3.0.2` and `ws@8.21.0`, and shared Zod `^4.4.3`, no source/dependency patches). Full local `pnpm verify` passed: 1373 Vitest tests with 2 expected skips, 176 tooling tests, typechecks/build/package smoke; pack/tarball verification passed. Broad frozen dependency installation remains blocked by the configured mirror's `node-addon-require-builtin@0.1.6` HTTP 404. Full official-root-helper and CI qualification remain pending. This candidate is not a published-artifact, live Desktop, OAuth or model-call compatibility claim.
17
+
3
18
  ## 0.4.0-alpha.24 (prepared)
4
19
 
5
20
  - Declare the exact `remote.githubCopilotSearchRouting` dependency in the search UI child Fiber so the Web search card can render under Cordis service tracing (#137).
package/README.md CHANGED
@@ -9,9 +9,9 @@
9
9
 
10
10
  A focused DSH companion for GitHub Copilot sign-in, account-aware model profiles, Copilot-specific tool compatibility, and provider-hosted search. It reuses DSH's built-in `@deepseek-ai/dsh-llm-pi-ai`; it is not a second Copilot model adapter or catalog.
11
11
 
12
- ## Tested baselines
12
+ ## Compatibility baselines and qualification targets
13
13
 
14
- | DSH surface | Tested source | Models UI |
14
+ | DSH surface | Exact source pin | Models UI seam |
15
15
  |---|---|---|
16
16
  | Controlled Desktop `0.1.1-rc.2` baseline | Controlled Core commit [`a772dbb`](https://github.com/cloga/deepseek-harness/commit/a772dbbde82780bff2b9394427e9f0a24cafa1d5) on `cloga-pi-ai-model-api` | Dedicated **Settings → GitHub Copilot** section |
17
17
  | DSH `0.1.2-rc.1` | Tag commit [`a66e470`](https://github.com/deepseek-ai/deepseek-harness/commit/a66e4702047846cdaa10c66c9d3df3951f5ea70d) | **Settings → Models** provider card |
@@ -20,9 +20,10 @@ A focused DSH companion for GitHub Copilot sign-in, account-aware model profiles
20
20
  | Official DSH `0.1.5-alpha.2` | Tag commit [`b2e3b2a`](https://github.com/deepseek-ai/deepseek-harness/commit/b2e3b2a0125854567a4a5fcba75782e42fe84901) | **Settings → Models** provider card |
21
21
  | Official DSH `0.1.5-rc.1` | Tag commit [`183f08e`](https://github.com/deepseek-ai/deepseek-harness/commit/183f08e9c6dde7e36cd2318eaee70b0da08fb35e) | **Settings → Models** provider card |
22
22
  | Official DSH `0.1.5-rc.2` | Tag commit [`fb2c4b9`](https://github.com/deepseek-ai/deepseek-harness/commit/fb2c4b9e698e30edb738bca4cf0618587db7d203) | **Settings → Models** provider card |
23
- | Official DSH `0.1.6-alpha.1` (current target) | Tag commit [`0a15e36`](https://github.com/deepseek-ai/deepseek-harness/commit/0a15e36e7f82b6ed45af6fa9759f29b40dcd965d) | **Settings → Models** provider card |
23
+ | Official DSH `0.1.6-alpha.1` | Tag commit [`0a15e36`](https://github.com/deepseek-ai/deepseek-harness/commit/0a15e36e7f82b6ed45af6fa9759f29b40dcd965d) | **Settings → Models** provider card |
24
+ | Official DSH `0.1.6-alpha.2` (current qualification target) | Tag `dsh-v0.1.6-alpha.2`, commit [`ddefc45`](https://github.com/deepseek-ai/deepseek-harness/commit/ddefc45fbc7f8e46dd73185e68295696d1297887) | **Settings → Models** provider card |
24
25
 
25
- The table retains historical source pins; it does not imply the account-model route has been verified on every baseline. Published-artifact synthetic transport tests use the **rc.1 adapter with pi 0.85.1**; development dependencies remain pinned to `0.1.2-rc.1`. The controlled rc.2 pin is historical regression evidence only. DSH `0.1.3-alpha.1`, official `0.1.5-alpha.1`, `0.1.5-alpha.2`, `0.1.5-rc.1`, `0.1.5-rc.2`, and `0.1.6-alpha.1` are unchanged tagged-source targets: CI exercises each through an isolated test resolver, without building or patching Core. These source-runtime checks must pass before claiming compatibility; they do not establish standalone npm-artifact, live endpoint, installed Desktop, or loaded-runtime proof. Existing public Host, Client, and Remote seams are retained. Stock Core model-entry `api` support is not a prerequisite for the plugin-owned route. Package peer and `engines.dsh` ranges are admission declarations, not live compatibility proof. No Core patch is installed by this plugin.
26
+ The table retains historical source pins; it does not imply the account-model route has been verified on every baseline. Published-artifact synthetic transport tests use the **rc.1 adapter with pi 0.85.1**; development dependencies remain pinned to `0.1.2-rc.1`. The controlled rc.2 pin is historical regression evidence only. DSH `0.1.3-alpha.1`, official `0.1.5-alpha.1`, `0.1.5-alpha.2`, `0.1.5-rc.1`, `0.1.5-rc.2`, `0.1.6-alpha.1`, and `0.1.6-alpha.2` are unchanged tagged-source targets: CI exercises each through an isolated test resolver, without building or patching Core. These source-runtime checks must pass before claiming compatibility; they do not establish standalone npm-artifact, live endpoint, installed Desktop, or loaded-runtime proof. Existing public Host, Client, and Remote seams are retained. Stock Core model-entry `api` support is not a prerequisite for the plugin-owned route. Package peer and `engines.dsh` ranges are admission declarations, not live compatibility proof. No Core patch is installed by this plugin.
26
27
 
27
28
  ### Alpha.11 compatibility correction (#105)
28
29
 
@@ -52,9 +53,15 @@ The built Client intentionally requests React from DSH's browser `ModuleLoader`
52
53
 
53
54
  Alpha.24 fixes the Web search card's missing traced Remote dependency. It remains in **Settings → Models** (`settings.models.footer`, list/root), with an old-Core Web search section fallback, not General. The search child waits independently for its routing namespace; account controls and all search safety guards are unchanged. Actual packaged Desktop acceptance is still a separate gate.
54
55
 
56
+ ### Alpha.25 official-first DSH 0.1.6-alpha.2 adaptation
57
+
58
+ The candidate appends the ninth exact target, `dsh-v0.1.6-alpha.2` at `ddefc45fbc7f8e46dd73185e68295696d1297887`. Strict Remote descriptors now provide alpha.2 `create()` factories while retaining a legacy `schema` bridge to the same strict parser. Dedicated executor projection admission uses native `subagent/descriptor` **v3**, already v3 in rc.1: the old v1 assumption was a plugin bug, not an upstream v1-to-v3 migration. Projection cache **`stateVersion: 2`** forces refolding, not history conversion. Unknown/v1/v2 descriptor histories fail closed and remain unmodified; review the old child and explicitly create a new child if needed, never fake a conversion by relabeling its descriptor.
59
+
60
+ Source markers, local rc.1-backed focused tests and fifteen scoped exact-source runtime tests passed (alpha.2 contracts 8, Remote 1 and Session-context 6). Full local `pnpm verify` passed: 1373 Vitest tests with 2 expected skips, 176 tooling tests, typechecks, build and package smoke; pack/tarball verification also passed. The scoped run used a supplemental resolver with official TypeScript `6.0.3`, declared `mime-types@3.0.2` and `ws@8.21.0`, and shared Zod `^4.4.3`, without source/dependency patches; it is not full official-root-helper qualification. Broad frozen dependency installation remains blocked by the configured mirror returning HTTP 404 for `node-addon-require-builtin@0.1.6`. **CI qualification has not executed.** No published-artifact compatibility, live Desktop activation, OAuth or real model-call success is claimed. The [official-first matrix](./docs/official-first-016-alpha2.md) records exact official sources, support scope, retained gaps and retirement triggers rather than assuming missing parity from feature names.
61
+
55
62
  ## Install and sign in
56
63
 
57
- The commands below target the package version `0.4.0-alpha.24`. Versioned URLs describe the intended release artifacts, not proof that publication or local activation has completed; use them only once that Release and its checksums are available. Install into the profile you use (replace `web` when targeting another profile):
64
+ The commands below target the package version `0.4.0-alpha.26`. Versioned URLs describe the intended release artifacts, not proof that publication or local activation has completed; use them only once that Release and its checksums are available. Install into the profile you use (replace `web` when targeting another profile):
58
65
 
59
66
  Before installing/updating, unpack the **checksum-verified** archive into a temporary directory and run its read-only composition preflight (replace all paths with absolute paths for the intended profile):
60
67
 
@@ -67,7 +74,7 @@ Include any launcher patch files with repeated `--patch /absolute/file` argument
67
74
  For approved online installation, the supported CLI command is:
68
75
 
69
76
  ```sh
70
- dsh plugin --profile web add https://github.com/cloga/dsh-github-copilot/releases/download/v0.4.0-alpha.24/dsh-github-copilot-0.4.0-alpha.24.tgz
77
+ dsh plugin --profile web add https://github.com/cloga/dsh-github-copilot/releases/download/v0.4.0-alpha.26/dsh-github-copilot-0.4.0-alpha.26.tgz
71
78
  ```
72
79
 
73
80
  If registry access is blocked or unavailable, do not retry it through another network. Desktop-managed profiles may instead use the [controlled offline CLI procedure](./docs/npm-distribution.md#controlled-offline-cli-maintenance), with an approved, checksum-verified local Release and existing dependency cache (`--offline --ignore-scripts`). All preflight and approval requirements still apply.
@@ -132,7 +139,7 @@ Agents should treat the browser authorization as a human handoff, not as a token
132
139
  5. Confirm **Signed in** and inspect the automatic discovery result before asking the user to choose a model. Already-signed-in Models opening ensures missing/stale metadata automatically; fresh ready cache makes no request. Use visible **Retry** for errors or **Manage → Refresh models** for an intentional forced update, not routine setup. Status alone does not discover, and login, metadata and successful model calls remain separate evidence.
133
140
  6. Use **Sign out** only when the user explicitly asks to disconnect the account. It deletes the Copilot credential record but preserves route settings.
134
141
 
135
- GitHub Releases and npm are the default distribution channels for each new version, using the same verified tarball. Pin the version and verify the evidence for the channel used: Release `SHA256SUMS`, and npm `dist.integrity` when installing from npm. The native Desktop package manager is preferred when permitted registry access is available; after npm publication is verified it accepts `dsh-github-copilot@0.4.0-alpha.24`, not a URL or file. Desktop-managed profiles also support explicitly approved [controlled offline CLI maintenance](./docs/npm-distribution.md#controlled-offline-cli-maintenance) with a verified local Release and `--offline --ignore-scripts`. Follow the mandatory search-composition preflight, backup, single-writer and post-install checks; do not bypass a corporate registry ban, disable TLS verification or restart without separate approval. Offline installation is not proof that npm networking/publication was repaired. See [distribution and publication requirements](./docs/npm-distribution.md).
142
+ GitHub Releases and npm are the default distribution channels for each new version, using the same verified tarball. Pin the version and verify the evidence for the channel used: Release `SHA256SUMS`, and npm `dist.integrity` when installing from npm. The native Desktop package manager is preferred when permitted registry access is available; after npm publication is verified it accepts `dsh-github-copilot@0.4.0-alpha.26`, not a URL or file. Desktop-managed profiles also support explicitly approved [controlled offline CLI maintenance](./docs/npm-distribution.md#controlled-offline-cli-maintenance) with a verified local Release and `--offline --ignore-scripts`. Follow the mandatory search-composition preflight, backup, single-writer and post-install checks; do not bypass a corporate registry ban, disable TLS verification or restart without separate approval. Offline installation is not proof that npm networking/publication was repaired. See [distribution and publication requirements](./docs/npm-distribution.md).
136
143
 
137
144
  No `copilot2api` process, external gateway, placeholder API key, pasted GitHub token, or separate `dsh-web-search-provider` installation is required.
138
145
 
@@ -151,10 +158,12 @@ DSH Core continues to own model selection, sandboxing, tools, attachments, and o
151
158
 
152
159
  Under **Settings → Models → Model roles**, enable dedicated dual-model sessions, select two available account models, save, and choose **Create session with this configuration** for an existing workspace. The planner handles planning and acceptance; `copilot_execute` delegates implementation to a native continuable child with a fixed execution model. Configuration is off by default and affects only sessions created through this entry. It does not change the global default, existing sessions, credentials or the ordinary Subagent model-selection setting.
153
160
 
154
- Unavailable models are not substituted. Uncertain creation retries keep the same request identity. The feature requires public role/session/subagent capabilities and is visibly unavailable when they are absent; historical package compatibility is not blanket certification of this optional flow. See [setup, lifecycle, limitations and evidence](./docs/dual-model.md). The feature is included in the `0.4.0-alpha.24` candidate; source and fixture tests are not proof of publication or Desktop activation.
161
+ Unavailable models are not substituted. Uncertain creation retries keep the same request identity. The feature requires public role/session/subagent capabilities and is visibly unavailable when they are absent; historical package compatibility is not blanket certification of this optional flow. See [setup, lifecycle, limitations and evidence](./docs/dual-model.md). The feature is included in the `0.4.0-alpha.26` candidate; source and fixture tests are not proof of publication or Desktop activation.
155
162
 
156
163
  If the card says **Could not load model roles**, do not change model defaults to work around it: this is a failed settings load, distinct from unsupported capabilities or unavailable models. In particular, a `githubCopilotDualModel/view` HTTP 404 indicates missing Host Remote exposure, not that the feature is off. See [troubleshooting and verification](./docs/dual-model.md#loading-and-remote-troubleshooting).
157
164
 
165
+ Native model, workspace and search-provider dropdowns use paired application-theme surface/text colors, including unavailable options, so dark mode does not leave pale labels on a white popup. Hosts without those theme tokens use readable system-color fallbacks. Appearance changes do not save or replace model/search selections.
166
+
158
167
  ## Shared account, independent sessions (V3)
159
168
 
160
169
  One Host-owned Copilot account supplies many account-discovered models. Each explicitly selected or history-backed Session keeps its own model context: search for Session A uses the captured effective request-header/config of initiating Session A (or explicit request `GenerateOptions`), not Session B's choice or a future global default C. Search plans are cached per owner so different-model A/B requests do not reuse or cancel each other's plans. Account metadata remains shared; capability/probe and credential checks still apply.
@@ -342,9 +351,9 @@ pnpm verify
342
351
  pnpm pack --pack-destination artifacts
343
352
  ```
344
353
 
345
- Use Node 24 LTS for development and the pinned pnpm version; runtime dependencies require Node >=22.19.0. `pnpm verify` runs the Agent contract check, source and local test typechecking, baseline markers, clean build, Vitest and Node tooling tests, and a real built Host import plus Client/Remote smoke. After packing, run `pnpm verify:tarball -- artifacts/dsh-github-copilot-<package-version>.tgz` to verify archive exports, media, allowed contents and equality to that build. CI checks all eight exact Core sources/config fixtures on Windows and Linux: controlled `0.1.1-rc.2`, `0.1.2-rc.1`, `0.1.3-alpha.1`, official `0.1.5-alpha.1`, `0.1.5-alpha.2`, `0.1.5-rc.1`, `0.1.5-rc.2`, and `0.1.6-alpha.1`. The six tagged-source targets also run unchanged tagged-source runtime fixtures; release publication depends on that full matrix.
354
+ Use Node 24 LTS for development and the pinned pnpm version; runtime dependencies require Node >=22.19.0. `pnpm verify` runs the Agent contract check, source and local test typechecking, baseline markers, clean build, Vitest and Node tooling tests, and a real built Host import plus Client/Remote smoke. After packing, run `pnpm verify:tarball -- artifacts/dsh-github-copilot-<package-version>.tgz` to verify archive exports, media, allowed contents and equality to that build. The CI definition targets all nine exact Core sources/config fixtures on Windows and Linux: controlled `0.1.1-rc.2`, `0.1.2-rc.1`, `0.1.3-alpha.1`, official `0.1.5-alpha.1`, `0.1.5-alpha.2`, `0.1.5-rc.1`, `0.1.5-rc.2`, `0.1.6-alpha.1`, and `0.1.6-alpha.2`. All seven tagged-source targets are gated by unchanged tagged-source runtime fixtures; release publication depends on that full matrix. This candidate's CI qualification has not executed; see the alpha.25 evidence limits above.
346
355
 
347
- For the optional reasoning UI integration, `pnpm verify:reasoning-ui -- <Core checkout>` runs a synthetic native-renderer, Slot registry and history-assembly fixture against a clean pinned `0.1.2-rc.1`, `0.1.3-alpha.1`, `0.1.5-alpha.1`, `0.1.5-alpha.2`, `0.1.5-rc.1`, `0.1.5-rc.2`, or `0.1.6-alpha.1` checkout with its Chat dependencies installed. It exclusively creates one temporary test file and removes it only if unchanged. This is local integration/static-render evidence, not a live browser or Copilot API test; CI runs it on all seven supported Chat baselines.
356
+ For the optional reasoning UI integration, `pnpm verify:reasoning-ui -- <Core checkout>` runs a synthetic native-renderer, Slot registry and history-assembly fixture against a clean pinned `0.1.2-rc.1`, `0.1.3-alpha.1`, `0.1.5-alpha.1`, `0.1.5-alpha.2`, `0.1.5-rc.1`, `0.1.5-rc.2`, `0.1.6-alpha.1`, or `0.1.6-alpha.2` checkout with its Chat dependencies installed. It exclusively creates one temporary test file and removes it only if unchanged. This is local integration/static-render evidence, not a live browser or Copilot API test; the CI definition covers all eight supported Chat baselines, without implying this candidate's qualification has run.
348
357
 
349
358
  ### Agent-driven development
350
359
 
@@ -376,8 +385,8 @@ Report the published Release URL, version, tag/commit and verified asset SHA-256
376
385
  `package.json` declares public npm distribution. A release tag must equal `v${package.json.version}`. Versions use standard SemVer prerelease labels (`alpha`, `beta`, or `rc`), each with its matching npm dist-tag; only stable versions use `latest`. The Release workflow performs the frozen install and complete verification gate, packs once (or recovers the original archive on retry), verifies `SHA256SUMS`, publishes the immutable GitHub Release and then publishes those same bytes to npm through OIDC. Either channel failing means delivery is incomplete. First package creation needs an authorized maintainer; staging requires an existing package and is not a first-package bootstrap. Historical releases are not republished.
377
386
 
378
387
  ```sh
379
- curl -LO https://github.com/cloga/dsh-github-copilot/releases/download/v0.4.0-alpha.24/dsh-github-copilot-0.4.0-alpha.24.tgz
380
- curl -LO https://github.com/cloga/dsh-github-copilot/releases/download/v0.4.0-alpha.24/SHA256SUMS
388
+ curl -LO https://github.com/cloga/dsh-github-copilot/releases/download/v0.4.0-alpha.26/dsh-github-copilot-0.4.0-alpha.26.tgz
389
+ curl -LO https://github.com/cloga/dsh-github-copilot/releases/download/v0.4.0-alpha.26/SHA256SUMS
381
390
  sha256sum --check SHA256SUMS
382
391
  ```
383
392
 
@@ -385,7 +394,7 @@ PowerShell can verify the same two downloaded files with:
385
394
 
386
395
  ```powershell
387
396
  $expected = (Get-Content .\SHA256SUMS).Split()[0]
388
- $actual = (Get-FileHash .\dsh-github-copilot-0.4.0-alpha.24.tgz -Algorithm SHA256).Hash.ToLowerInvariant()
397
+ $actual = (Get-FileHash .\dsh-github-copilot-0.4.0-alpha.26.tgz -Algorithm SHA256).Hash.ToLowerInvariant()
389
398
  if ($actual -cne $expected) { throw 'Release checksum mismatch' }
390
399
  ```
391
400
 
package/README.zh.md CHANGED
@@ -9,13 +9,13 @@
9
9
 
10
10
  一个聚焦 GitHub Copilot 登录、通用账号模型发现、Copilot 专用 Tool 兼容与供应方托管搜索的 DSH companion。插件根据供应方返回的端点和能力元数据组装模型,复用公开的 `@deepseek-ai/dsh-llm-pi-ai` adapter 与 pi-ai SDK,不另写一套通用传输/序列化器,也不维护需要逐个添加新模型 ID 的静态目录。
11
11
 
12
- > 下文自动维护账号模型元数据与 provider 集成控件描述目标版本 `0.4.0-alpha.24`;这不代表已有的两条真实路由被合并或移除。版本化 URL 不表示 Release 已发布或本机已加载;仅在该 Release 与校验和可用后使用安装命令。源码、发布制品、已安装版本和实际加载运行时需分别确认,本地升级和中断会话的重启仍需用户批准。
12
+ > 下文自动维护账号模型元数据与 provider 集成控件描述目标版本 `0.4.0-alpha.26`;这不代表已有的两条真实路由被合并或移除。版本化 URL 不表示 Release 已发布或本机已加载;仅在该 Release 与校验和可用后使用安装命令。源码、发布制品、已安装版本和实际加载运行时需分别确认,本地升级和中断会话的重启仍需用户批准。
13
13
 
14
14
  Alpha.24 修复 Web search 卡片缺少精确 Remote 依赖声明的问题。卡片仍位于 **Settings → Models**(`settings.models.footer`,list/root),旧 Core 回退到独立 Web search section,而非 General。搜索子 Fiber 独立等待 routing namespace,不影响账号控件和既有搜索安全检查;实际打包 Desktop 验收仍是独立关卡。
15
15
 
16
- ## 已测试基线
16
+ ## 兼容基线与待验收目标
17
17
 
18
- | DSH 表面 | 已测试源码 | Models UI |
18
+ | DSH 表面 | 精确源码 pin | Models UI 接口 |
19
19
  |---|---|---|
20
20
  | 受控 Desktop `0.1.1-rc.2` 基线 | `cloga-pi-ai-model-api` 上的受控 Core commit [`a772dbb`](https://github.com/cloga/deepseek-harness/commit/a772dbbde82780bff2b9394427e9f0a24cafa1d5) | 独立的 **Settings → GitHub Copilot** section |
21
21
  | DSH `0.1.2-rc.1` | Tag commit [`a66e470`](https://github.com/deepseek-ai/deepseek-harness/commit/a66e4702047846cdaa10c66c9d3df3951f5ea70d) | **Settings → Models** provider card |
@@ -24,9 +24,10 @@ Alpha.24 修复 Web search 卡片缺少精确 Remote 依赖声明的问题。卡
24
24
  | 官方 DSH `0.1.5-alpha.2` | Tag commit [`b2e3b2a`](https://github.com/deepseek-ai/deepseek-harness/commit/b2e3b2a0125854567a4a5fcba75782e42fe84901) | **Settings → Models** provider card |
25
25
  | 官方 DSH `0.1.5-rc.1` | Tag commit [`183f08e`](https://github.com/deepseek-ai/deepseek-harness/commit/183f08e9c6dde7e36cd2318eaee70b0da08fb35e) | **Settings → Models** provider card |
26
26
  | 官方 DSH `0.1.5-rc.2` | Tag commit [`fb2c4b9`](https://github.com/deepseek-ai/deepseek-harness/commit/fb2c4b9e698e30edb738bca4cf0618587db7d203) | **Settings → Models** provider card |
27
- | 官方 DSH `0.1.6-alpha.1`(当前目标) | Tag commit [`0a15e36`](https://github.com/deepseek-ai/deepseek-harness/commit/0a15e36e7f82b6ed45af6fa9759f29b40dcd965d) | **Settings → Models** provider card |
27
+ | 官方 DSH `0.1.6-alpha.1` | Tag commit [`0a15e36`](https://github.com/deepseek-ai/deepseek-harness/commit/0a15e36e7f82b6ed45af6fa9759f29b40dcd965d) | **Settings → Models** provider card |
28
+ | 官方 DSH `0.1.6-alpha.2`(当前待验收目标) | Tag `dsh-v0.1.6-alpha.2`,commit [`ddefc45`](https://github.com/deepseek-ai/deepseek-harness/commit/ddefc45fbc7f8e46dd73185e68295696d1297887) | **Settings → Models** provider card |
28
29
 
29
- 上表保留历史源码 pin,不表示账号模型路由在所有基线上都已验收。已发布制品的合成 transport 测试使用 **rc.1 adapter 与 pi `0.85.1`**,开发依赖继续精确固定为 `0.1.2-rc.1`;受控 rc.2 仅为历史回归证据。`0.1.3-alpha.1`、官方 `0.1.5-alpha.1`、`0.1.5-alpha.2`、`0.1.5-rc.1`、`0.1.5-rc.2` 与 `0.1.6-alpha.1` 均作为未修改的标签源码目标,由 CI 使用隔离测试解析器运行,不构建或给 Core 打补丁。对应源码运行检查通过前不宣称兼容性已验收;这些检查不是独立 npm 制品、真实端点、已安装 Desktop 或已加载运行时的证明。已有公开 Host、Client 与 Remote 接口保留。Peer range 与 `engines.dsh` 只声明包准入,不是真实兼容性证明;插件不安装 Core 补丁。
30
+ 上表保留历史源码 pin,不表示账号模型路由在所有基线上都已验收。已发布制品的合成 transport 测试使用 **rc.1 adapter 与 pi `0.85.1`**,开发依赖继续精确固定为 `0.1.2-rc.1`;受控 rc.2 仅为历史回归证据。`0.1.3-alpha.1`、官方 `0.1.5-alpha.1`、`0.1.5-alpha.2`、`0.1.5-rc.1`、`0.1.5-rc.2`、`0.1.6-alpha.1` 与 `0.1.6-alpha.2` 均作为未修改的标签源码目标,由 CI 使用隔离测试解析器运行,不构建或给 Core 打补丁。对应源码运行检查通过前不宣称兼容性已验收;这些检查不是独立 npm 制品、真实端点、已安装 Desktop 或已加载运行时的证明。已有公开 Host、Client 与 Remote 接口保留。Peer range 与 `engines.dsh` 只声明包准入,不是真实兼容性证明;插件不安装 Core 补丁。
30
31
 
31
32
  ### Alpha.11 兼容修复(#105)
32
33
 
@@ -54,6 +55,12 @@ Candidate manifest 将 `@deepseek-ai/dsh-authorization` 与 `@deepseek-ai/schema
54
55
 
55
56
  实际 built Client 会从 DSH 浏览器 `ModuleLoader` singleton 请求 React。React 不是 Desktop Host shared package,也不应作为 Node profile 的必需 peer 安装。Alpha.22 声明 `dsh.client.external: [\"react\"]`,移除 root React peer,仅在开发依赖中保留 React。Packed verification 现在覆盖全部 required peer 与 Client external,确认真实 built Client 只向 loader 请求 React,并继续要求 authorization/schemastery 使用 Host peer。该修复解决 packaged Desktop 启动错误 `requires missing react@^18.2.0`,不启用 peer 自动安装、不打包第二份 React,也不弱化 Desktop graph validator。实际 packaged Electron 加载仍由下游验收 gate 证明。
56
57
 
58
+ ### Alpha.25 官方优先的 DSH 0.1.6-alpha.2 适配
59
+
60
+ Candidate 追加第九个精确目标:`dsh-v0.1.6-alpha.2`,commit `ddefc45fbc7f8e46dd73185e68295696d1297887`。严格 Remote descriptor 提供 alpha.2 所需的 `create()` factory,同时保留旧 Gateway 的 `schema` bridge;两者使用同一个严格 parser,不降级为 `src-json`。执行子代理的 projection 接受原生 `subagent/descriptor` **v3**;rc.1 已经是 v3,旧版 v1 假设属于插件错误,不是本次上游从 v1 升到 v3。插件 projection cache 提升到 **`stateVersion: 2`**,强制从事件重新折叠,不转换历史。未知/v1/v2 descriptor 历史保守拒绝且保持原样;需要继续工作时先审核旧子代理,再显式新建子代理,不能改版本号伪造转换。
61
+
62
+ 源码 marker、本地基于 rc.1 的定向测试,以及十五个限定范围精确源码运行时测试(alpha.2 contracts 8、Remote 1、Session-context 6)已通过。完整本地 `pnpm verify` 通过:1373 个 Vitest 测试、2 个预期跳过、176 个 tooling 测试,以及类型检查、构建和 package smoke;pack/tarball 验证也通过。限定范围运行使用补充 resolver、官方 TypeScript `6.0.3`、声明的 `mime-types@3.0.2` 与 `ws@8.21.0` 和共享 Zod `^4.4.3`,不修改源码或依赖制品,不等于完整 official-root-helper 验收。完整 frozen 依赖安装仍被配置 mirror 对 `node-addon-require-builtin@0.1.6` 返回 HTTP 404 阻塞。**CI 验收尚未执行**;不宣称已发布制品兼容、真实 Desktop 激活、OAuth 或模型调用成功。[官方优先矩阵](./docs/official-first-016-alpha2.md) 记录精确官方源码、支持范围、保留差距与移除条件,不因未验证同等能力就断言官方没有该功能。
63
+
57
64
  ## 安装与登录
58
65
 
59
66
  将当前 release 安装到你实际使用的 profile(其它 profile 请替换 `web`):
@@ -69,7 +76,7 @@ node package/scripts/check-search-composition.mjs --profile-dir /absolute/profil
69
76
  获准且网络可用时,可通过受支持的 CLI 命令安装:
70
77
 
71
78
  ```sh
72
- dsh plugin --profile web add https://github.com/cloga/dsh-github-copilot/releases/download/v0.4.0-alpha.24/dsh-github-copilot-0.4.0-alpha.24.tgz
79
+ dsh plugin --profile web add https://github.com/cloga/dsh-github-copilot/releases/download/v0.4.0-alpha.26/dsh-github-copilot-0.4.0-alpha.26.tgz
73
80
  ```
74
81
 
75
82
  若 registry 被公司封禁或不可用,不要更换网络绕行。Desktop 管理的 profile 可以改用[受控离线 CLI 流程](./docs/npm-distribution.md#controlled-offline-cli-maintenance):使用来源获准、校验通过的本地 Release 和已有依赖缓存(`--offline --ignore-scripts`)。预检、备份和授权要求仍然适用。
@@ -134,7 +141,7 @@ Agent 应把浏览器授权视为需要用户完成的 handoff,而不是自行
134
141
  5. 确认 **Signed in** 并检查自动发现结果,再请用户选择模型。已登录时打开 Models 会自动确保缺失/过期元数据,新鲜 ready 缓存不发请求。错误可使用 **Retry**,有意强制更新时使用 **Manage → Refresh models**,不作为常规设置步骤。状态读取本身不发现;登录、元数据与真实调用成功是独立证据。
135
142
  6. 只有用户明确要求断开账号时才使用 **Sign out**;它会删除 Copilot credential record,但保留 route settings。
136
143
 
137
- 每个新版本默认同时分发到 GitHub Releases 和 npm,两个渠道使用同一份已验证 tarball。应固定版本并核对所用渠道的证据:Release 的 `SHA256SUMS`;从 npm 安装时另核对 `dist.integrity`。在获准且可用的 registry 网络环境中,优先使用原生 Desktop 包管理器;确认 npm 发布后,它接受 `dsh-github-copilot@0.4.0-alpha.24`,不是 URL 或本地文件。Desktop 管理的 profile 也允许经明确授权的[受控离线 CLI 维护](./docs/npm-distribution.md#controlled-offline-cli-maintenance):使用已验证的本地 Release 和 `--offline --ignore-scripts`,执行必需的组合预检、私密元数据备份、单写入者控制及安装后差异核验。缓存不足或出现权限拒绝时停止,不绕过公司 registry 封禁,不关闭 TLS 校验;重启仍需单独授权。离线安装成功不表示 npm 联网或发布问题已修好。[双渠道发布与 OIDC 要求](./docs/npm-distribution.md)保持不变。
144
+ 每个新版本默认同时分发到 GitHub Releases 和 npm,两个渠道使用同一份已验证 tarball。应固定版本并核对所用渠道的证据:Release 的 `SHA256SUMS`;从 npm 安装时另核对 `dist.integrity`。在获准且可用的 registry 网络环境中,优先使用原生 Desktop 包管理器;确认 npm 发布后,它接受 `dsh-github-copilot@0.4.0-alpha.26`,不是 URL 或本地文件。Desktop 管理的 profile 也允许经明确授权的[受控离线 CLI 维护](./docs/npm-distribution.md#controlled-offline-cli-maintenance):使用已验证的本地 Release 和 `--offline --ignore-scripts`,执行必需的组合预检、私密元数据备份、单写入者控制及安装后差异核验。缓存不足或出现权限拒绝时停止,不绕过公司 registry 封禁,不关闭 TLS 校验;重启仍需单独授权。离线安装成功不表示 npm 联网或发布问题已修好。[双渠道发布与 OIDC 要求](./docs/npm-distribution.md)保持不变。
138
145
 
139
146
  不需要运行 `copilot2api`,不需要外部 gateway、placeholder API key、原始 GitHub token 或单独安装 `dsh-web-search-provider`。
140
147
 
@@ -155,10 +162,12 @@ DSH Core 继续负责模型选择、sandbox、工具、附件与其它 provider
155
162
 
156
163
  在 **设置 → 模型 → 模型分工** 中启用双模型会话,选择账号下可用的主模型和执行模型,保存后选工作区,再点 **用此配置新建会话**。主模型负责规划与验收;`copilot_execute` 创建原生可继续执行的子代理,并固定其执行模型。默认关闭,仅专用入口创建的新会话采用此策略;不修改全局默认、已有会话、登录凭据或原生 Subagent 授权开关。
157
164
 
158
- 模型不可用时明确报错,不自动替换。创建结果不明时重试同一个请求,不为绕过未知结果另建会话。功能依赖公开的会话、策略和子代理能力;缺少接口时显示不可用,不把历史版本的包兼容范围当成此功能的全面验收。详见[配置、生命周期、限制与验证范围](./docs/dual-model.md)。本功能包含在 `0.4.0-alpha.24` candidate 中,源码和合成测试不代表已发布或当前 Desktop 已生效。
165
+ 模型不可用时明确报错,不自动替换。创建结果不明时重试同一个请求,不为绕过未知结果另建会话。功能依赖公开的会话、策略和子代理能力;缺少接口时显示不可用,不把历史版本的包兼容范围当成此功能的全面验收。详见[配置、生命周期、限制与验证范围](./docs/dual-model.md)。本功能包含在 `0.4.0-alpha.26` candidate 中,源码和合成测试不代表已发布或当前 Desktop 已生效。
159
166
 
160
167
  若卡片显示 **Could not load model roles(无法加载模型分工)**,不要通过修改默认模型绕过:这是设置加载失败,与能力不支持或模型不可用不同。尤其 `githubCopilotDualModel/view` 返回 HTTP 404,表示 Host Remote 未暴露,并非功能开关处于关闭状态。详见[加载故障排查与验证](./docs/dual-model.md#loading-and-remote-troubleshooting)。
161
168
 
169
+ 模型、工作区和搜索 Provider 的原生下拉控件及不可用选项使用成对的应用主题背景/文字颜色,避免深色模式弹出白底浅字列表;缺少主题 token 的旧环境采用可读的系统颜色回退。配色变化不会保存或替换模型/搜索选择。
170
+
162
171
  ## 全局账号,多模型与独立会话(V3)
163
172
 
164
173
  一个 Host 所有的 Copilot 账号提供多个账号发现模型。已显式选择或有历史选择的 Session 保持自己的模型上下文:Session A 的搜索使用捕获的发起 Session A 的有效 request-header/config(或请求显式 `GenerateOptions`),不采用 Session B 的选择或未来全局默认 C。搜索 plan 按 owner 缓存,A/B 使用不同模型时不会互相复用或取消 plan;账号元数据仍共享,能力/probe 与凭据检查继续生效。
@@ -353,9 +362,9 @@ pnpm verify
353
362
  pnpm pack --pack-destination artifacts
354
363
  ```
355
364
 
356
- 开发建议使用 Node 24 LTS 和固定的 pnpm 版本;运行时依赖要求 Node >=22.19.0。`pnpm verify` 检查 Agent contract、源码与本地测试类型、baseline marker、干净构建、Vitest 与 Node 工具测试,以及真实构建 Host 导入和 Client/Remote smoke。打包后执行 `pnpm verify:tarball -- artifacts/dsh-github-copilot-<package-version>.tgz`,检查归档 export、图片、允许的文件以及与本次构建的一致性。CI Windows/Linux 上验证八个精确 Core 源码与配置 fixture:受控 `0.1.1-rc.2`、`0.1.2-rc.1`、`0.1.3-alpha.1`、官方 `0.1.5-alpha.1`、`0.1.5-alpha.2`、`0.1.5-rc.1`、`0.1.5-rc.2` 与 `0.1.6-alpha.1`;六个标签源码目标还运行未修改的标签源码运行时 fixture。发布必须等待完整矩阵通过。
365
+ 开发建议使用 Node 24 LTS 和固定的 pnpm 版本;运行时依赖要求 Node >=22.19.0。`pnpm verify` 检查 Agent contract、源码与本地测试类型、baseline marker、干净构建、Vitest 与 Node 工具测试,以及真实构建 Host 导入和 Client/Remote smoke。打包后执行 `pnpm verify:tarball -- artifacts/dsh-github-copilot-<package-version>.tgz`,检查归档 export、图片、允许的文件以及与本次构建的一致性。CI 定义在 Windows/Linux 上覆盖九个精确 Core 源码与配置 fixture:受控 `0.1.1-rc.2`、`0.1.2-rc.1`、`0.1.3-alpha.1`、官方 `0.1.5-alpha.1`、`0.1.5-alpha.2`、`0.1.5-rc.1`、`0.1.5-rc.2`、`0.1.6-alpha.1` 与 `0.1.6-alpha.2`;全部七个标签源码目标还需通过未修改的标签源码运行时 fixture。发布必须等待完整矩阵通过;本 candidate 的 CI 验收尚未执行,证据限制见上文 alpha.25 说明。
357
366
 
358
- 对于可选的思考显示集成,`pnpm verify:reasoning-ui -- <Core checkout>` 会在已安装 Chat 依赖的干净、精确 pin 的 `0.1.2-rc.1`、`0.1.3-alpha.1`、`0.1.5-alpha.1`、`0.1.5-alpha.2`、`0.1.5-rc.1`、`0.1.5-rc.2` 或 `0.1.6-alpha.1` checkout 中,执行合成的原生渲染器、Slot 注册器与历史组装 fixture。它只会独占创建一个临时测试文件,并仅在文件未被修改时清理。这是本地集成/静态渲染证据,不是真实浏览器或 Copilot API 测试;CI 在七个支持该 Chat 接口的基线上运行此项。
367
+ 对于可选的思考显示集成,`pnpm verify:reasoning-ui -- <Core checkout>` 会在已安装 Chat 依赖的干净、精确 pin 的 `0.1.2-rc.1`、`0.1.3-alpha.1`、`0.1.5-alpha.1`、`0.1.5-alpha.2`、`0.1.5-rc.1`、`0.1.5-rc.2`、`0.1.6-alpha.1` 或 `0.1.6-alpha.2` checkout 中,执行合成的原生渲染器、Slot 注册器与历史组装 fixture。它只会独占创建一个临时测试文件,并仅在文件未被修改时清理。这是本地集成/静态渲染证据,不是真实浏览器或 Copilot API 测试;CI 定义覆盖八个支持该 Chat 接口的基线,不表示本 candidate 已执行验收。
359
368
 
360
369
  ### Agent 驱动开发
361
370
 
@@ -387,8 +396,8 @@ node scripts/agent.mjs attribution "DeepSeek Harness (DSH)"
387
396
  `package.json` 声明公开 npm 分发。Release tag 必须严格等于 `v${package.json.version}`。预发布使用 `alpha`、`beta` 或 `rc` 及对应 npm dist-tag,只有稳定版使用 `latest`。Release workflow 执行 frozen install 和完整门禁,只打包一次(重试恢复原始归档),验证 `SHA256SUMS`,发布不可变 GitHub Release,再通过 OIDC 将同一份字节发布到 npm。任一渠道失败都表示交付未完成。首次建包须由获准环境中的维护者完成;staging 要求包已存在,不能代替首次建包。不会批量补发历史版本。
388
397
 
389
398
  ```sh
390
- curl -LO https://github.com/cloga/dsh-github-copilot/releases/download/v0.4.0-alpha.24/dsh-github-copilot-0.4.0-alpha.24.tgz
391
- curl -LO https://github.com/cloga/dsh-github-copilot/releases/download/v0.4.0-alpha.24/SHA256SUMS
399
+ curl -LO https://github.com/cloga/dsh-github-copilot/releases/download/v0.4.0-alpha.26/dsh-github-copilot-0.4.0-alpha.26.tgz
400
+ curl -LO https://github.com/cloga/dsh-github-copilot/releases/download/v0.4.0-alpha.26/SHA256SUMS
392
401
  sha256sum --check SHA256SUMS
393
402
  ```
394
403
 
@@ -396,7 +405,7 @@ PowerShell 可以对已下载的同一组文件执行:
396
405
 
397
406
  ```powershell
398
407
  $expected = (Get-Content .\SHA256SUMS).Split()[0]
399
- $actual = (Get-FileHash .\dsh-github-copilot-0.4.0-alpha.24.tgz -Algorithm SHA256).Hash.ToLowerInvariant()
408
+ $actual = (Get-FileHash .\dsh-github-copilot-0.4.0-alpha.26.tgz -Algorithm SHA256).Hash.ToLowerInvariant()
400
409
  if ($actual -cne $expected) { throw 'Release checksum mismatch' }
401
410
  ```
402
411
 
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "package": {
10
10
  "name": "dsh-github-copilot",
11
- "version": "0.4.0-alpha.24"
11
+ "version": "0.4.0-alpha.26"
12
12
  },
13
13
  "evidence": {
14
14
  "kind": "source-and-synthetic-test-inventory",
@@ -19,11 +19,11 @@
19
19
  "platforms": ["windows", "linux"],
20
20
  "node": ">=22.19.0",
21
21
  "dsh": {
22
- "release": "0.1.6-alpha.1",
23
- "tag": "dsh-v0.1.6-alpha.1",
24
- "commit": "0a15e36e7f82b6ed45af6fa9759f29b40dcd965d",
22
+ "release": "0.1.6-alpha.2",
23
+ "tag": "dsh-v0.1.6-alpha.2",
24
+ "commit": "ddefc45fbc7f8e46dd73185e68295696d1297887",
25
25
  "developmentRelease": "0.1.2-rc.1",
26
- "peerRange": "0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.6-alpha.1",
26
+ "peerRange": "0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2",
27
27
  "baselines": [
28
28
  {
29
29
  "release": "0.1.1-rc.2",
@@ -145,6 +145,29 @@
145
145
  "managedProviderValidation": "synthetic-tagged-source-runtime",
146
146
  "resolvedProfileDiagnostics": "plugin-owned-empty-modelErrors",
147
147
  "runtimeTests": ["tests/preview-route.spec.ts", "tests/published-core.spec.ts", "tests/single-route.spec.ts", "tests/search-routing.spec.ts", "tests/routed-web.spec.ts", "tests/deepseek-search-fallback.spec.ts", "tests/tool-schema-compat.spec.ts", "tests/fixtures/session-context-core.fixture.ts", "tests/fixtures/remote-core.fixture.ts"]
148
+ },
149
+ {
150
+ "release": "0.1.6-alpha.2",
151
+ "tag": "dsh-v0.1.6-alpha.2",
152
+ "commit": "ddefc45fbc7f8e46dd73185e68295696d1297887",
153
+ "source": "https://github.com/deepseek-ai/deepseek-harness",
154
+ "modelsUi": "provider-card",
155
+ "providerHeaders": "fetch-validated-discovery",
156
+ "strictModeCompat": "route-switch",
157
+ "fileContentHelper": "contentHasFile",
158
+ "agentCreation": "awaited-serial-agent-created",
159
+ "sessionHistory": "request-header-and-projections-no-new-sync-history",
160
+ "strictRemoteCodecs": "create-factories-with-legacy-schema-bridge",
161
+ "roleChildDescriptorVersion": 3,
162
+ "roleChildCacheVersion": 2,
163
+ "roleChildHistory": "unknown-legacy-history-fail-closed",
164
+ "runtimeDependencies": "public-resolution-and-unload",
165
+ "clientSessionContext": "multiple-session-owner-isolation",
166
+ "evidenceScope": "unchanged-tagged-source-target",
167
+ "standaloneNpmArtifacts": "not-tested",
168
+ "managedProviderValidation": "synthetic-tagged-source-runtime",
169
+ "resolvedProfileDiagnostics": "plugin-owned-empty-modelErrors",
170
+ "runtimeTests": ["tests/preview-route.spec.ts", "tests/published-core.spec.ts", "tests/single-route.spec.ts", "tests/search-routing.spec.ts", "tests/routed-web.spec.ts", "tests/deepseek-search-fallback.spec.ts", "tests/tool-schema-compat.spec.ts", "tests/fixtures/alpha2-contracts-core.fixture.ts", "tests/remote-codec.spec.ts", "tests/dual-model-projection.spec.ts", "tests/fixtures/session-context-core.fixture.ts", "tests/fixtures/remote-core.fixture.ts"]
148
171
  }
149
172
  ],
150
173
  "packages": [
@@ -172,7 +195,7 @@
172
195
  "zod": "^4.4.3"
173
196
  },
174
197
  "sharedPeerDependencies": {
175
- "@deepseek-ai/dsh-authorization": "0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.6-alpha.1",
198
+ "@deepseek-ai/dsh-authorization": "0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2",
176
199
  "@deepseek-ai/schemastery": "^3.18.2"
177
200
  },
178
201
  "clientExternals": {
@@ -455,7 +478,8 @@
455
478
  "required": true,
456
479
  "sourceMarkers": [
457
480
  {"file": "src/remote.ts", "marker": "dsh-github-copilot#GitHubCopilotAuthorizationView"},
458
- {"file": "src/remote.ts", "marker": "mode: 'strict'"},
481
+ {"file": "src/remote.ts", "marker": "strictRemoteCodec"},
482
+ {"file": "src/remote-codec.ts", "marker": "mode: 'strict' as const, typeSymbol, schema, create: (): Schema => schema"},
459
483
  {"file": "src/remote.ts", "marker": "accountModels: z.object"}
460
484
  ],
461
485
  "tests": [
@@ -730,11 +754,12 @@
730
754
  "id": "dsh-supported-baselines-fail-loud-guard",
731
755
  "required": true,
732
756
  "sourceMarkers": [
733
- {"file": "src/compatibility.ts", "marker": "peerRange: '0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.6-alpha.1'"}
757
+ {"file": "src/compatibility.ts", "marker": "peerRange: '0.1.1-rc.2 || 0.1.2-rc.1 || 0.1.3-alpha.1 || 0.1.5-alpha.1 || 0.1.5-alpha.2 || 0.1.5-rc.1 || 0.1.5-rc.2 || 0.1.6-alpha.1 || 0.1.6-alpha.2'"}
734
758
  ],
735
759
  "tests": [
736
760
  {"file": "tests/compatibility.spec.ts", "name": "retains the original three compatibility baselines"},
737
- {"file": "tests/compatibility.spec.ts", "name": "adds 0.1.6-alpha.1 without dropping earlier baselines or advancing development dependencies"},
761
+ {"file": "tests/compatibility.spec.ts", "name": "adds 0.1.6-alpha.2 without dropping earlier baselines or advancing development dependencies"},
762
+ {"file": "tests/compatibility.spec.ts", "name": "declares exact alpha2 contract targets without claiming live or artifact validation"},
738
763
  {"file": "tests/compatibility.spec.ts", "name": "accepts the supported DSH service contract"},
739
764
  {"file": "tests/compatibility.spec.ts", "name": "fails before startup when a required API is absent"}
740
765
  ]
@@ -30,6 +30,16 @@ The browser generates a request UUID and keeps the original workspace and settin
30
30
 
31
31
  After a confirmed save conflict, reload settings and review the current configuration. During an uncertain creation the original input is held until confirmation. Reloading the whole browser can lose its in-memory pending receipt; inspect the session list before issuing a fresh creation request. The same supplied request UUID remains idempotent on the Host across process restart.
32
32
 
33
+ ## Alpha.25 descriptor and Remote compatibility
34
+
35
+ The candidate targets official `dsh-v0.1.6-alpha.2` at `ddefc45fbc7f8e46dd73185e68295696d1297887`, without changing the retained development pin `0.1.2-rc.1`. Strict Remote descriptors expose `create()` factories for alpha.2 and retain the legacy `schema` field for older Gateways. Both paths use the same strict parser; this is not a downgrade to `src-json` and does not change the `view`, `save` or `create` endpoint payloads.
36
+
37
+ Dedicated executor admission now reads native **`subagent/descriptor` v3** (continuable `spawn`, explicit `agentProvider` and `agentModel`, and the declared native fields). Native descriptors were **already v3 in rc.1**. The plugin's previous v1 expectation was a plugin/test bug, not an alpha.2 change from v1 to v3. The plugin role-policy version, native descriptor version, and whole-Session storage-format version are distinct contracts.
38
+
39
+ The plugin-owned projection cache advances to **`stateVersion: 2`**, forcing Core to refold the durable events rather than trust a stale cached admission result. Refolding is a read-derived cache rebuild, **not a history migration**. Unknown, v1, v2, malformed or conflicting child descriptors fail closed and cannot authorize an executor overlay; their stored histories remain unmodified. Do not edit a version number, synthesize a v3 descriptor, or call this a conversion. Review the existing child and its work, then explicitly create a **new child** through the dedicated planner if continuation is needed. Keep the original history for inspection; this does not authorize automatic replacement or replay.
40
+
41
+ The exact official-first review and retirement conditions are in [official-first alpha.2](./official-first-016-alpha2.md). Source markers, local rc.1-backed focused tests and fifteen scoped exact-source runtime tests passed across alpha.2 contracts (8), Remote (1) and Session-context (6) fixtures. Full local `pnpm verify` passed: 1373 Vitest tests with 2 expected skips, 176 tooling tests, typechecks, build and package smoke; pack/tarball verification passed. The scoped run uses a supplemental resolver with official TypeScript `6.0.3`, declared `mime-types@3.0.2` and `ws@8.21.0`, and shared Zod `^4.4.3`, without source/dependency patches. Broad frozen dependency installation remains blocked by `node-addon-require-builtin@0.1.6` returning HTTP 404 from the configured mirror; full official-root-helper and CI qualification remain pending. None of this establishes live Desktop or published-artifact compatibility.
42
+
33
43
  ## Loading and Remote troubleshooting
34
44
 
35
45
  **Could not load model roles** is a failed Remote load, not an instruction to change global model defaults. A `githubCopilotDualModel/view` HTTP 404 means the Host did not expose the endpoint; Client descriptors alone cannot register Host methods. The Host uses the public `TypertRemoteService` binding and marks only `view`, `save` and `create` with `@Remote`. A source fix does not change an already running installation.
@@ -46,6 +56,14 @@ These are the actual built component with **synthetic** account/workspace respon
46
56
 
47
57
  ![Light narrow screen: one synthetic session created](./images/dual-model-mobile.png)
48
58
 
59
+ ## Native dropdown appearance
60
+
61
+ Model, workspace and search-provider selects and their options use the application's surface, primary/secondary text and border tokens. They do not infer the application theme from the operating system. Hosts without the tokens use paired system-color fallbacks. This is presentation only: changing theme does not save settings or replace selections.
62
+
63
+ After building, `node tests/browser/verify-native-selects.mjs --playwright-module /absolute/path/to/existing/playwright-core/index.mjs --channel msedge` runs optional isolated browser checks without installing a browser dependency. It checks computed option/control colors, synthetic contrast, theme switching without remount or writes, 375px layout and enabled-control system fallbacks. The fixtures supply theme tokens rather than global option styling, so fixture CSS cannot hide a missing component style.
64
+
65
+ Page screenshots do not necessarily contain the OS-owned expanded popup. Check the expanded native menu separately on the target browser, including unavailable/disabled entries and the selected highlight. The automated computed-style checks are not full Windows popup-painting or live Desktop acceptance evidence; historical captures above predate this appearance fix.
66
+
49
67
  ## Public integration and evidence
50
68
 
51
69
  The feature reuses public settings, account discovery, scope, Agent creation, Session projection/persistence, workspace attachment, tool restrictions/guards and native continuable subagents. It does not access Core private registries, edit prototypes, patch deployed packages, copy grants, install another wire adapter or require a Core change.
@@ -59,6 +77,8 @@ Regression evidence is separated deliberately:
59
77
  - `dual-model-remote.spec.ts` / `dual-model-gateway.spec.ts`: strict owned codecs and the actual installed Client Gateway with synthetic RPC. Older Client Gateways do not sanitize successful values or arbitrary nested error details; the Host builds bounded DTOs, and the UI renders only its diagnostic allowlist.
60
78
  - `tests/scripts/dual-model-host-gateway.test.mjs`: postbuild Node tests drive the real public Host Connection Fetch handler and Gateway, bypassing Vitest's protocol stub. They cover endpoint exposure, unsupported capabilities, domain input validation, private-method refusal, disposal, and synthetic model/workspace view plus CAS save. SRC JSON fallback does not inherit the Client's strict descriptors; Host validation rejects malformed nested inputs.
61
79
  - `dual-model-host.spec.ts`: actual Core Session/projection/scope/tool primitives combined with synthetic Agent, model, persistence and workspace edges. This is not a paid live model run or a full installed Desktop certification.
80
+ - `remote-codec.spec.ts` / `dual-model-projection.spec.ts`: strict factory/legacy-parser bridge, native v3 descriptor admission, cache version/refolding contract, and fail-closed malformed/unknown/v1/v2 histories without mutation.
81
+ - `tests/fixtures/alpha2-contracts-core.fixture.ts`: exact alpha.2 contract fixture run through `scripts/verify-tagged-core.mjs`; the narrow supplemental exact-source run passed, but full official-helper closure qualification remains pending as described above, not implied by local rc.1-backed tests.
62
82
  - `tests/browser/serve-dual-model.mjs`: serves the actual built Client component on a separate loopback fixture using synthetic account/workspace responses. Run after `pnpm build`; the printed URL is explicitly **not** the production DSH GUI.
63
83
 
64
84
  Publication, Desktop installation, runtime activation and successful real model calls remain separate checks. Never restart active sessions or claim the installed UI changed merely because the repository build passed.
@@ -70,3 +90,5 @@ Publication, Desktop installation, runtime activation and successful real model
70
90
  仅专用入口创建的新会话采用此策略;不修改已有会话、全局默认模型、登录凭据或原生 Subagent 授权开关。模型不可用时明确报错,不自动换模型。需要换角色模型时请另建会话,不要用普通模型选择器改专用角色。插件卸载后不再提供该策略保障;这是协作流程约束,不代替 Core 的沙箱或审批。
71
91
 
72
92
  创建结果不明时重试同一请求,避免重复会话;不要凭下载、构建或合成测试成功就宣称已安装、已生效或真实模型调用成功。
93
+
94
+ Alpha.25 改为接受原生 `subagent/descriptor` v3;rc.1 已经是 v3,旧 v1 判断是插件错误,不是上游历史格式升级。插件 projection cache 的 `stateVersion: 2` 仅强制重新折叠事件,不转换历史。未知/v1/v2/无效 descriptor 均保守拒绝且保留原历史,须审核旧子代理的工作后显式新建子代理,不能改版本号伪造 v3。Remote 使用严格 `create()` factory,并为旧 Gateway 保留同 parser 的 `schema` bridge。十五个限定范围精确源码运行时测试已通过,覆盖 alpha.2 contracts 8、Remote 1、Session-context 6 三个文件(补充 resolver、官方 TypeScript `6.0.3`、声明的 `mime-types@3.0.2` 与 `ws@8.21.0`、共享 Zod `^4.4.3`,不修改源码或依赖制品)。完整本地 `pnpm verify` 通过:1373 个 Vitest 测试、2 个预期跳过、176 个 tooling 测试,以及类型检查、构建和 package smoke;pack/tarball 验证也通过。实际 Host Gateway 严格解析由显式测试局部 contribution 验证,不代表生产 factory 已自动注册;生产 source fallback 独立校验输入。完整 frozen 依赖安装仍被 mirror 的 `node-addon-require-builtin@0.1.6` HTTP 404 阻塞,完整 official-root-helper 验收待执行,CI 未执行。限定范围及本地 rc.1 定向测试通过不代表完整矩阵、live Desktop 或已发布制品兼容。
@@ -0,0 +1,36 @@
1
+ # Official-first review: DSH 0.1.6-alpha.2
2
+
3
+ ## Target and evidence boundary
4
+
5
+ Candidate plugin **`0.4.0-alpha.25`** adds the ninth exact target: official **`dsh-v0.1.6-alpha.2`**, commit **`ddefc45fbc7f8e46dd73185e68295696d1297887`**. All eight earlier pins remain, including the historical controlled Desktop baseline; development dependencies remain exactly `0.1.2-rc.1`. This review inspected the unchanged official source checkout read-only. Every official source link below is pinned to that commit, not a moving branch. The [official release notes](https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.1.6-alpha.2) were also reviewed: runtime dependency resolution/unload and multiple coexisting Client Sessions make lifecycle and ownership checks mandatory; native subagent sidebar support is not frozen planner/executor policy parity. Native vision-input and Messages API fixes remain the adapter's responsibility, and the companion must not duplicate or override them. The new Plugin Manager owns persistent installation; this adaptation adds no dynamic-plugin replacement or installer. These notes plus source contracts are not published-artifact or installed-runtime qualification.
6
+
7
+ Prefer official implementations when they satisfy the requirement, including configuration/data migration, API behavior, safety and runtime acceptance. **Complete** means the cited official contract covers the named scope, not that a live deployment passed. **Partial** identifies both an official capability and a concrete remaining requirement. **Unverified** means parity has not been established; it does not mean official support is absent. Decisions are **retain**, **migrate**, or **retire**; conditional retirement requires the evidence in the last column and a reviewed change, never automatic removal on a version bump.
8
+
9
+ ## Compact decision matrix
10
+
11
+ | Custom surface / purpose | Exact official source and support | Decision | Remaining gap / retirement trigger |
12
+ |---|---|---|---|
13
+ | OAuth/native adapter: one Host credential lifecycle and normal Copilot transport | **Complete for the native owner:** [pi-ai flow registration](https://github.com/deepseek-ai/deepseek-harness/blob/ddefc45fbc7f8e46dd73185e68295696d1297887/packages/llm/llm-pi-ai/src/login.ts#L111-L161), [credential bridge](https://github.com/deepseek-ai/deepseek-harness/blob/ddefc45fbc7f8e46dd73185e68295696d1297887/packages/llm/llm-pi-ai/src/auth.ts), [public adapter export](https://github.com/deepseek-ai/deepseek-harness/blob/ddefc45fbc7f8e46dd73185e68295696d1297887/packages/llm/llm-pi-ai/src/index.ts#L65-L88). **Unverified** for replacing the companion's strict grant normalization and conditional bootstrap in every retained profile. | **Retain** thin integration with official ownership; **retire** any duplicate general transport/auth path rather than introducing one (none is authorized here). | Keep credentials Host-only and native refresh/transport. Remove the conditional bootstrap or grant bridge only after each affected profile provides the service and native persistence satisfies the same JSON-only grant contract, with runtime acceptance and no credential copying. |
14
+ | Account discovery: account-authorized endpoints/capabilities, new IDs and bounded freshness | **Partial:** official [discovery](https://github.com/deepseek-ai/deepseek-harness/blob/ddefc45fbc7f8e46dd73185e68295696d1297887/packages/llm/llm-pi-ai/src/discovery.ts#L1-L43) explicitly uses the installed catalog for catalog providers; wire interrogation of other routes returns draft candidates for user adoption, not a catalog refresh. | **Retain** account-scoped metadata source feeding the official adapter. | The cited path is not equivalent to authenticated Copilot metadata with per-model `supported_endpoints`, account invalidation, TTL/cooldown and no static-ID intersection. **Migrate**, then retire this source, once official behavior meets those requirements and migration preserves settings, history, selections and account proof. No claim is made about every other official discovery path. |
15
+ | Frozen role selection: dedicated planner/executor pair captured per new root | **Partial:** [native v3 descriptor](https://github.com/deepseek-ai/deepseek-harness/blob/ddefc45fbc7f8e46dd73185e68295696d1297887/packages/subagent/subagent/src/descriptor.ts#L1-L85), [cold-resume route restoration](https://github.com/deepseek-ai/deepseek-harness/blob/ddefc45fbc7f8e46dd73185e68295696d1297887/packages/subagent/subagent/src/continuation.ts#L434-L448), and [native tool configuration](https://github.com/deepseek-ai/deepseek-harness/blob/ddefc45fbc7f8e46dd73185e68295696d1297887/packages/subagent/tool-subagent/src/index.ts#L75-L130) already support explicit child models and scoped composition. End-to-end parity for the dedicated UI/root policy is **unverified**. | **Migrate** erroneous plugin descriptor admission to native v3; **retain** the dedicated policy overlay. | An optional model-selection setting is not evidence of fixed per-root pair enforcement, session-local creation, CAS or uncertain-create identity. Retire the overlay only after an official path demonstrates these behaviors, no global-default writes, no fallback model and equivalent reviewed recovery. |
16
+ | Provider search policy: follow initiating Chat or explicit primary, one distinct final fallback | **Partial:** official [Web selection/registration/search](https://github.com/deepseek-ai/deepseek-harness/blob/ddefc45fbc7f8e46dd73185e68295696d1297887/packages/web/web/src/index.ts#L50-L146) supports configured IDs, unique-usable auto-selection, cancellation forwarding and source caps. Its documented selection rules are not the companion's Chat-following/final-fallback policy. | **Retain** reversible facade and namespaced Models policy; continue using official provider/tool contracts. | Retirement requires exact registered-ID discovery, captured initiating owner, provider-owned search model, one distinct final fallback, no fallback on cancellation/account-proof invalidation, and honest backend/API-charge disclosure. Review original web composition restoration before removing the facade; do not infer whole-product absence from this one service. |
17
+ | Remote boundary: strict validation across old and alpha.2 Gateways | **Complete for factory shape:** [TypertCodec](https://github.com/deepseek-ai/deepseek-harness/blob/ddefc45fbc7f8e46dd73185e68295696d1297887/packages/typert/protocol/src/types.ts#L212-L232), [loader validation](https://github.com/deepseek-ai/deepseek-harness/blob/ddefc45fbc7f8e46dd73185e68295696d1297887/packages/typert/loader/src/index.ts#L270-L278), [Host decode](https://github.com/deepseek-ai/deepseek-harness/blob/ddefc45fbc7f8e46dd73185e68295696d1297887/packages/api/gateway/src/index.ts#L1135-L1155). Cross-baseline runtime qualification remains pending. | **Migrate** to strict `create()` factories; **retain** legacy `schema` bridge. | Both fields resolve the same strict parser; never use `src-json` as a compatibility escape. Retire only the legacy field/helper when old supported consumers no longer require it and exact Host/Client boundary regressions pass. Endpoint payloads remain unchanged. |
18
+ | Lifecycle/Session seam: initialize policy before queued work; rebuild derived state safely | **Complete for serialized initialization:** official [Agent announcement](https://github.com/deepseek-ai/deepseek-harness/blob/ddefc45fbc7f8e46dd73185e68295696d1297887/packages/core/agent/src/index.ts#L524-L555) awaits `ctx.serial(..., 'agent/created', ...)`. | **Retain** awaited initialization and public projection integration; **retire** the old cache generation via `stateVersion: 2`. | Refold durable events, never add synchronous history reads or rewrite descriptors. Retire plugin lifecycle glue only if official dedicated-policy lifecycle covers creation, resume, cancellation, unload and recovery. Broad exact-source and live acceptance remain unverified. |
19
+ | UI seam: integrated account controls, Models search/role cards and reversible cleanup | **Complete for extension slots:** official [Models section declaration](https://github.com/deepseek-ai/deepseek-harness/blob/ddefc45fbc7f8e46dd73185e68295696d1297887/packages/client/ui-settings-models/src/client/index.ts#L131-L141) exposes keyed/root `settings.models.provider-card` and list/root `settings.models.footer`. Full official parity for the companion workflows is **unverified**. | **Retain** additive contributions and old-Core fallback; preserve native Edit/Delete. | Retire each custom card only when official UI covers its account/discovery or search/role workflow with the same safety, accessibility and lifecycle behavior and passes actual Client/Desktop acceptance. Slot existence is not feature parity and does not authorize hiding or merging real routes. |
20
+
21
+ ## Descriptor correction is not a history conversion
22
+
23
+ Native `subagent/descriptor` was already **v3 in the retained rc.1 baseline**; the plugin's v1 expectation was a plugin/test bug. Alpha.25 admits the native continuable `spawn` descriptor with explicit `agentProvider`/`agentModel`, and validates its declared native fields. Native descriptor v3, plugin role-policy version, plugin projection cache version and whole-Session storage-format versions are separate concepts.
24
+
25
+ The plugin projection's **`stateVersion: 2`** forces refolding from events rather than reusing old cached child admission. For dedicated role-owned roots/lineages, unknown/v1/v2, malformed or conflicting child descriptors **fail closed and remain unmodified**. Ordinary native children outside that lineage remain Core-owned, including inherited-model `spawn` children and other provider backends; the global creation listener must not reject them for failing the dedicated executor grammar. Neither a cache rebuild nor changing a numeric field can recover missing provenance/composition. Review the original child's state and work before explicitly creating a **new child** through the dedicated planner. Never synthesize a v3 descriptor, automatically replace the child, replay work, or advertise a fake conversion. Official Session-format migration code elsewhere is not authorization to reinterpret a plugin's invalid role descriptor. See [model roles](./dual-model.md#alpha25-descriptor-and-remote-compatibility).
26
+
27
+ ## Qualification ledger and release gate
28
+
29
+ - **Passed, local verification:** exact source markers and full `pnpm verify`: **1373 Vitest tests passed, 2 expected skips, 176 tooling tests passed**, plus typechecks, build and package smoke. Pack/tarball verification passed. The unrelated-native-child ownership regression was fixed and reviewed. These local checks do not execute all alpha.2 services.
30
+ - **Passed, scoped exact-source runtime: 15/15 tests across three files** — `alpha2-contracts-core.fixture.ts` (8), `remote-core.fixture.ts` (1), and `session-context-core.fixture.ts` (6). Coverage includes the real native v3 descriptor and projection-cache restore, real Typert registry codec registration/disposal, public WebRuntime unload, Client authorization/roles/catalog Gateway paths and Session context. Actual Host Gateway strict parsing is exercised through an **explicit test-local contribution**; this is not evidence of autogenerated production factory registration. The production source fallback independently validates its inputs. This supplemental run uses unchanged exact public source, official **TypeScript `6.0.3`**, declared **`mime-types@3.0.2`** and **`ws@8.21.0`**, and shared Zod `^4.4.3`. Scratch dependencies were installed through the normal configured mirror without Core or dependency-artifact patches. This is not qualification of the full official-root-helper dependency closure.
31
+ - **Blocked broad frozen source-runtime setup:** the configured dependency mirror returns **HTTP 404 for `node-addon-require-builtin@0.1.6`**. The scoped run resolved its TypeScript and `mime-types` prerequisites; they are no longer blockers. The unchanged official-root-helper CI fixture was not run locally against the full frozen closure. Dependency setup failure is not evidence of a plugin/Core contract failure, and scoped success is not a passing full-runtime matrix.
32
+ - **Full official-helper qualification pending:** `tests/fixtures/alpha2-contracts-core.fixture.ts`, together with existing Remote/Session context fixtures through `scripts/verify-tagged-core.mjs`, must pass in the complete gate. Local `tests/remote-codec.spec.ts` and `tests/dual-model-projection.spec.ts` cover the regression contract separately.
33
+ - **Not executed:** candidate CI qualification. The intended Windows/Linux gate preserves all **nine** exact baselines, with all **seven** tagged-source targets using unchanged source-runtime fixtures. The optional Chat fixture additionally covers the retained rc.1 target.
34
+ - **Not claimed:** live Copilot/OAuth requests, published npm/Core/Desktop artifact compatibility, packaged Electron activation, installed/loaded version equivalence, or a published alpha.25 release. Package ranges and source markers are admission/static evidence only.
35
+
36
+ Before delivery, record exact fixture results and all required CI on the candidate revision, then follow immutable publication and packed-byte verification. A dependency blocker must remain visible rather than being hidden by disabling tests, patching Core/dependencies, or claiming official support is absent. Any approved installation is separate from activation; preserve running Sessions and do not restart them for this review.