dsh-deeppilot 0.9.5 → 0.9.7

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/COMPATIBILITY.md CHANGED
@@ -1,13 +1,14 @@
1
1
  # Compatibility
2
2
 
3
- This branch targets exactly **two DSH releases**: `0.2.0-rc.2`, which the npm
4
- `latest`/`next` channels point at, and `0.2.1-alpha.3`, which the `alpha` channel
5
- points at. Both are named in `peerDependencies`; no other version is accepted.
6
- DSH evaluates that range before composing a profile — on every start, not only on
7
- install — so a newly published DSH release deactivates this plugin until the
8
- range is widened deliberately. That is the intended trade: a plugin that cannot
9
- run on an unaudited host fails visibly instead of misbehaving quietly. The
10
- decision and the reversal it represents are recorded in
3
+ This branch targets exactly **four DSH releases**: `0.2.0-rc.2`, which the npm
4
+ `latest`/`next` channels point at, and `0.2.1-alpha.3`, `0.2.1-alpha.4`, and
5
+ `0.2.1-alpha.5`, which the `alpha` channel has pointed at in turn. All four are
6
+ named in both `engines.dsh` and `peerDependencies`; no other version is accepted.
7
+ DSH evaluates that declaration before composing a profile — on every start, not
8
+ only on install — so a newly published DSH release deactivates this plugin until
9
+ the list is widened deliberately. That is the intended trade: a plugin that
10
+ cannot run on an unaudited host fails visibly instead of misbehaving quietly.
11
+ The decision and the reversal it represents are recorded in
11
12
  [`docs/决策记录.md`](./docs/决策记录.md) (章节一), with the supporting audit in
12
13
  [`docs/DSH_RELEASE_MEMORY.md`](./docs/DSH_RELEASE_MEMORY.md).
13
14
 
@@ -18,7 +19,7 @@ is covered by the isolated compose and live-runs recorded in the release memory.
18
19
  | Component | Current contract | Evidence |
19
20
  |---|---|---|
20
21
  | Node.js | 22 or newer | Package engine and CI |
21
- | DSH CLI and Host API | `0.2.0-rc.2 \|\| 0.2.1-alpha.3` (dev pins `0.2.0-rc.2`) | Peer metadata, source typecheck, unit tests, bundle build, and config schema projection against a real 0.2.0-rc.2 CLI, plus isolated composes and live phone-protocol runs with the published 0.2.1-alpha.2 and 0.2.1-alpha.3 CLIs |
22
+ | DSH CLI and Host API | `engines.dsh` and `peerDependencies` both name `0.2.0-rc.2 \|\| 0.2.1-alpha.3 \|\| 0.2.1-alpha.4 \|\| 0.2.1-alpha.5` (dev pins `0.2.0-rc.2`) | Peer metadata, source typecheck, unit tests, bundle build, and config schema projection against a real 0.2.0-rc.2 CLI, plus isolated composes and live phone-protocol runs with the published 0.2.1-alpha.2, 0.2.1-alpha.3, and 0.2.1-alpha.4 CLIs, and an isolated 0.2.1-alpha.5 host where this plugin now composes, starts, and answers `/phone/health` with 200 on its own LAN listener (audit below) |
22
23
  | iOS bridge | DeepPilot protocol v2 | Bridge protocol tests; device behavior must be checked with the running Host and app |
23
24
  | Remote access | Tailscale Funnel on ports 443, 8443, or 10000 | Helper and supervisor tests |
24
25
 
@@ -70,6 +71,68 @@ carries the old top-level `debug: true` is accepted but that value is ignored:
70
71
  verbose logging must be turned on again from the settings page. No other config
71
72
  field changed shape, and the old key is not read anywhere in this version.
72
73
 
74
+ ## 0.2.1-alpha.5 audit outcome
75
+
76
+ The source-level audit of `dsh-v0.2.1-alpha.5` against `dsh-v0.2.1-alpha.4` found
77
+ no runtime break. Of the ten peer packages, **nine have byte-identical `lib/`
78
+ trees** — including `dsh-api-gateway` and the three Client faces the resident
79
+ interaction client loads — so every alpha.3 fix still holds unchanged. Only
80
+ `dsh-api-remotes/lib/client.js` differs: three hunks / 36 lines, all inside the
81
+ `account/getUnnotifiedBonuses` result schema, where the new optional `title`
82
+ field arrives while `campaign`, `amount`, `currency`, and `grantedAt` become
83
+ optional and are forwarded without validation. The file's exported symbols are
84
+ identical, and this plugin does not consume that endpoint, so the change is
85
+ additive from here.
86
+
87
+ The vendor peers need no widening either: both hosts' vendor pins moved from
88
+ prerelease to GA — `cordis 4.0.5-alpha.2` → `4.0.5` and `schemastery
89
+ 3.18.5-alpha.2` → `3.18.5` — and both GA releases already satisfy the existing
90
+ `~4.0.5-alpha.1` / `~3.18.5-alpha.1` ranges.
91
+
92
+ The activation verdict is the same shape as alpha.4, with one difference: alpha.5
93
+ resolves the requirements path from a declared `engines.dsh` alone, so its
94
+ refusal names that single requirement rather than the ten peers. Adding
95
+ `0.2.1-alpha.5` to the closed list therefore makes it activate, and the four
96
+ audited hosts pass while `0.2.1-alpha.1`, `0.2.1-alpha.2`, `0.2.0-rc.1`, `0.2.0`,
97
+ `0.2.1-rc.1`, `0.2.1`, `0.3.0-rc.1`, `0.3.0`, `1.0.0`, and `0.1.7-rc.2` remain
98
+ refused.
99
+
100
+ **Audit limits, stated rather than implied.** Loading this plugin on a real
101
+ isolated `0.2.1-alpha.5` host, and the full release check set (unit tests,
102
+ typecheck, build, config-schema check, helper tests) against that host, had
103
+ **not** been completed when this entry was written. Until they are, this release
104
+ is recorded as audited at the declaration and source-diff level only; no plugin
105
+ release has been made from this tree, and nothing here claims one.
106
+
107
+ ## 0.2.1-alpha.4 audit outcome
108
+
109
+ The source-level audit of `dsh-v0.2.1-alpha.4` against `dsh-v0.2.1-alpha.3` found
110
+ no runtime break and one deliberate activation break. Of the ten peer packages,
111
+ **eight have byte-identical `lib/` trees** — including `dsh-api-gateway` and the
112
+ three Client faces the resident interaction client loads — so every alpha.3 fix
113
+ still holds unchanged. Only `dsh-api-remotes` changed in code: one additive
114
+ Remote Events entry (`plugin-market/changed`) and the rename of
115
+ `IncompatiblePlugin.peers` to `requirements`, a field this plugin never reads.
116
+ Two packages appear for the first time — `dsh-plugin-market` and
117
+ `dsh-experimental-plugin-market-bundle` — behind the release's custom plugin
118
+ index sources; neither is a dependency of this plugin.
119
+
120
+ The activation break is the release's own stated migration: DSH now evaluates a
121
+ plugin's `engines.dsh` range **alone**, ignoring `peerDependencies` entirely
122
+ whenever that field is present. A package that declares no `engines.dsh` — as
123
+ this one did — keeps the older peer evaluation, so the previously exact peer
124
+ list rejected `0.2.1-alpha.4` and the plugin would not have activated on it.
125
+ Both declarations were widened from the previous three-release list to the same
126
+ four releases. The audit reproduced that refusal against the published
127
+ `evaluatePluginCompatibility` of both hosts before changing anything, and the
128
+ same harness confirms the four audited hosts pass while `0.2.1-alpha.2`,
129
+ `0.2.1`, and `0.3.0` still fail.
130
+
131
+ Nothing else moved. Protocol v2, pairing state, and device records are untouched,
132
+ so no paired phone needs to re-pair, and the vendor peers need no widening: both
133
+ hosts still vendor `cordis 4.0.5-alpha.2` and `schemastery 3.18.5-alpha.2`, which
134
+ the existing ranges already admit.
135
+
73
136
  ## 0.2.1-alpha.3 audit outcome
74
137
 
75
138
  The source-level audit of `dsh-v0.2.1-alpha.3` against `dsh-v0.2.1-alpha.2`
@@ -146,6 +209,10 @@ needs a documentation update, not a peer-range widening.
146
209
  > versions actually audited, `0.2.0-rc.2` and `0.2.1-alpha.3`; see the
147
210
  > 0.2.1-alpha.3 outcome above and `docs/决策记录.md` (章节一). The paragraphs in
148
211
  > this historical entry describe the policy as it stood on 2026-09-29.
212
+ > **This note is in turn superseded:** `0.2.1-alpha.4` was added the next day by
213
+ > the same deliberate audit step, `0.2.1-alpha.5` on 2026-10-16, and the closed
214
+ > four-release list now lives in `engines.dsh` as well as in `peerDependencies`.
215
+ > See the 0.2.1-alpha.5 outcome above.
149
216
 
150
217
  ## 0.2.0-rc.1 audit outcome
151
218
 
package/README.md CHANGED
@@ -32,15 +32,18 @@ Host on your own computer and does not replace or modify the DSH Web UI.
32
32
 
33
33
  ## Install from npm
34
34
 
35
- This source checkout targets Node.js 22+ and the two DSH releases it has been
36
- audited against — `0.2.0-rc.2` (the `latest`/`next` channels) and `0.2.1-alpha.3`
37
- (the `alpha` channel) — with a `web` profile. DSH checks a plugin's declared peer
38
- range before composing a profile, on every start rather than only on install, so
39
- any other host version refuses to activate this plugin. The package includes
40
- Funnel helpers for macOS, Linux, and Windows on amd64/arm64; trusted-LAN mode
41
- does not require the helper.
42
-
43
- The current working tree names exactly those two versions in
35
+ This source checkout targets Node.js 22+ and the four DSH releases it has been
36
+ audited against — `0.2.0-rc.2` (the `latest`/`next` channels) and the `alpha`
37
+ channel releases `0.2.1-alpha.3`, `0.2.1-alpha.4`, and `0.2.1-alpha.5` — with a
38
+ `web` profile. DSH checks a plugin's declared requirements before composing a
39
+ profile, on every start rather than only on install, so any other host version
40
+ refuses to activate this plugin. From DSH `0.2.1-alpha.4` on, that check reads
41
+ `engines.dsh` and ignores `peerDependencies`; older hosts know only the peer
42
+ range, so both name the same four releases. The package includes Funnel helpers
43
+ for macOS, Linux, and Windows on amd64/arm64; trusted-LAN mode does not require
44
+ the helper.
45
+
46
+ The current working tree names exactly those four versions in `engines.dsh` and
44
47
  `peerDependencies` and is built/typechecked against `0.2.0-rc.2`. A previously
45
48
  published plugin package may still carry its own older compatibility
46
49
  declaration until a release is made from this tree.
package/README.zh-CN.md CHANGED
@@ -30,15 +30,18 @@
30
30
 
31
31
  ## 从 npm 安装
32
32
 
33
- 当前源码面向 Node.js 22+ 与带 `web` profile 的**两个已审计 DSH 版本**:
34
- `0.2.0-rc.2`(`latest`/`next` 通道)与 `0.2.1-alpha.3`(`alpha` 通道)。
35
- DSH 在组合 profile 前会校验插件声明的 peer 范围,且**每次启动都会校验**(不只是
36
- 安装时),因此其他宿主版本会拒绝激活本插件。npm 包内置 macOS、Linux、Windows
37
- 的 amd64/arm64 Funnel helper;可信局域网模式不依赖 helper。
38
-
39
- 当前工作树的 `peerDependencies` 精确列出这两个版本,构建与类型检查针对
40
- `0.2.0-rc.2`。从此工作树发布新版本前,已发布的旧插件包仍可能带有各自旧的
41
- 兼容声明。
33
+ 当前源码面向 Node.js 22+ 与带 `web` profile 的**四个已审计 DSH 版本**:
34
+ `0.2.0-rc.2`(`latest`/`next` 通道),以及 `alpha` 通道的 `0.2.1-alpha.3`、
35
+ `0.2.1-alpha.4` 与 `0.2.1-alpha.5`。DSH 在组合 profile 前会校验插件声明的
36
+ 兼容要求,且**每次启动都会校验**(不只是安装时),因此其他宿主版本会拒绝
37
+ 激活本插件。从 DSH `0.2.1-alpha.4` 起,该校验只读 `engines.dsh` 并忽略
38
+ `peerDependencies`;更早的宿主只认 peer 范围,因此两处列出同一组四个版本。
39
+ npm 包内置 macOS、Linux、Windows 的 amd64/arm64 Funnel helper;可信局域网
40
+ 模式不依赖 helper。
41
+
42
+ 当前工作树的 `engines.dsh` 与 `peerDependencies` 精确列出这四个版本,构建与
43
+ 类型检查针对 `0.2.0-rc.2`。从此工作树发布新版本前,已发布的旧插件包仍可能
44
+ 带有各自旧的兼容声明。
42
45
 
43
46
  ```sh
44
47
  dsh plugin --profile web add dsh-deeppilot
@@ -3,7 +3,169 @@
3
3
  > This is the durable audit record for DeepPilot's public DSH plugin. Re-audit
4
4
  > the next DSH release instead of assuming that an rc upgrade is runtime-safe.
5
5
 
6
- ## Current decision
6
+ ## Current decision — `dsh-v0.2.1-alpha.5`
7
+
8
+ - **Audited release:** `dsh-v0.2.1-alpha.5`, the newest `alpha` channel release.
9
+ It is **not** `latest`; `latest`/`next` still point at `0.2.0-rc.2`.
10
+ - **Comparison baseline:** `dsh-v0.2.1-alpha.4` (the previous audited tag).
11
+ - **Plugin runtime verdict: no break, and no `src/` change was needed.** Nine of
12
+ the ten peer packages ship a byte-identical `lib/` tree, including
13
+ `dsh-api-gateway` and the three Client faces the resident interaction client
14
+ loads, so every alpha.3 fix still holds unchanged.
15
+ - **The one code difference is schema-only and additive.**
16
+ `@deepseek-ai/dsh-api-remotes/lib/client.js` is the only differing `lib/` file
17
+ among the ten peers: **three hunks, 36 changed lines** (14 insertions, 22
18
+ deletions), all inside the `account/getUnnotifiedBonuses` result schema. The
19
+ new `title` field is added as optional; `campaign`, `amount`, `currency`, and
20
+ `grantedAt` are relaxed to optional and the first three lose their validation
21
+ (`campaign` becomes "forwarded without validation", `amount` and `currency`
22
+ become unconstrained JSON); only the descriptions of `expiresAt` changed.
23
+ `orderId`, `expiresAt`, and `message` stay required. The module's **exported
24
+ symbols are identical** — both versions assign exactly `exports.apply` and
25
+ `exports.inject` — and this plugin does not consume that endpoint, so the
26
+ change cannot reach any call it makes.
27
+ - **Activation verdict: the new release is admitted by both declarations.** This
28
+ is the third consecutive release on this line to trip the deliberate
29
+ closed-list policy: alpha.5 was refused before the widening. alpha.5 reads a
30
+ declared `engines.dsh` alone, so its refusal reported a **single**
31
+ `engines.dsh` requirement rather than ten peers, and `exempted: false` — the
32
+ list is the only thing that admits a host, and no exemption fallback exists on
33
+ this machine (no profile `compatibility.json`).
34
+ - **Evidence: reproduced against the published evaluator, plus an isolated
35
+ host run.** The audit called alpha.5's own published
36
+ `evaluatePluginCompatibility` with empty exemptions against this plugin's real
37
+ `package.json`, over one candidate list. Raw output:
38
+ `.alpha5-verify/tmp-matrix-early.out.json` (13 candidates, `matrixAllPass:
39
+ true`) and `.alpha5-verify/stage1-baseline.out.json` (the pre-change baseline).
40
+ Accepted after the change: `0.2.1-alpha.5`, `0.2.1-alpha.3`,
41
+ `0.2.1-alpha.4`, and the stable `latest` host. Still refused:
42
+ `0.2.1-alpha.1`, `0.2.1-alpha.2`, `0.2.0-rc.1`, `0.2.0`, `0.2.1-rc.1`,
43
+ `0.2.1`, `0.3.0-rc.1`, `0.3.0`, `1.0.0`, and `0.1.7-rc.2`. The same file
44
+ confirms declaration sync: `engines.dsh` equals the `@deepseek-ai/dsh` peer
45
+ range, all ten peers share one range, and the token count is 4.
46
+ `.alpha5-verify/VERIFICATION.md` separately records the refusal on an isolated
47
+ alpha.5 host: `dsh: skipping profile bundle "dsh-deeppilot": … incompatible
48
+ with dsh 0.2.1-alpha.5: requirements {"engines.dsh":…}`, with the host itself
49
+ still booting (`/phone/health` → 404, so the plugin was genuinely not loaded).
50
+ `.alpha5-verify/stage1-dumpconfig-phaseA.stderr.txt`,
51
+ `stage1-dumpconfig-phaseA.stdout.txt`, and `stage1-host-phaseA.log` hold the
52
+ raw logs.
53
+ - **Vendor pins promoted to GA, with no range change needed.** Both hosts'
54
+ vendored third parties moved from prerelease to GA — `cordis
55
+ 4.0.5-alpha.2` → `4.0.5`, `schemastery 3.18.5-alpha.2` → `3.18.5`. Both GA
56
+ releases already satisfy the existing `~4.0.5-alpha.1` / `~3.18.5-alpha.1`
57
+ ranges, so the two vendor peers stay as they are.
58
+ `.alpha5-verify/stage1-semver-vendor.out.json` cross-checks that with four
59
+ independent solver paths (host `semver` and repo `semver`, each with and
60
+ without `includePrerelease`), all four agreeing.
61
+ - **Install verdict: the two declarations now agree on four releases.**
62
+ `engines.dsh` and all ten `@deepseek-ai/dsh*` peers name `0.2.0-rc.2 ||
63
+ 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5`, mirrored in
64
+ `tests/compatibility-metadata.test.ts`, `package-lock.json` (root entry only),
65
+ both READMEs, `COMPATIBILITY.md`, `AGENTS.md`, and the local
66
+ `docs/决策记录.md` (章节一, 条目4). The dev pins and `DSH_BASELINE` stay at the
67
+ exact `0.2.0-rc.2` this branch builds and typechecks against.
68
+ - **Protocol verdict: no phone-protocol change.** Protocol v2, pairing state, and
69
+ device records are untouched by this release; no phone needs to re-pair.
70
+ - **Post-widening verification — completed for the 0.9.7 preparation.**
71
+ - **C7 — real load on an isolated alpha.5 host: passed.** With the widened
72
+ declaration in place, the profile that used to be refused now composes and
73
+ starts. `--dump-config` writes nothing to stderr and no longer emits
74
+ `skipping profile bundle` (the pre-change baseline emitted 21 such lines); the
75
+ composed tree contains `# == dsh-deeppilot` together with
76
+ `# == @deepseek-ai/dsh-web-app, patched by dsh-deeppilot`; the running host
77
+ logs four `[deeppilot]` lines (`device registry loaded`, `data plane active`,
78
+ `LAN TLS identity created`, `local transport listening on https://0.0.0.0:3098`);
79
+ and `https://127.0.0.1:3098/phone/health` answers `200` with
80
+ `{"ok":true,"enabled":true,"protocolVersion":2,"serverVersion":"0.9.6","dataPlane":true}`.
81
+ - **Probe note — use the plugin's own listener, not DSH's web port.** The
82
+ pre-change baseline cited `http://127.0.0.1:3281/phone/health = 404` as its
83
+ refusal evidence. That probe has no discriminating power: `/phone/health` is
84
+ served by this plugin's own narrow LAN listener (`src/phone-server.ts`), which
85
+ by design never inherits DSH's wider web/API route surface, so the DSH web
86
+ port answers 404 whether or not the plugin loaded. The valid refusal evidence
87
+ was the skip warning; the valid positive evidence is port 3098.
88
+ - **C5/C6 — the full check set: passed in the release tree.** Clean `npm ci`,
89
+ repo-wide `npm test` (564 tests, 563 pass, 0 fail, 1 pre-existing TODO),
90
+ `npm run typecheck`, `npm run build` (regenerated `lib/` byte-identical to the
91
+ committed tree), `npm run check:config-schema` against the pinned
92
+ `0.2.0-rc.2` CLI, `go test ./...` for the helper, and all six
93
+ `bin/SHA256SUMS` entries verified.
94
+ - **Nothing has been published from this tree yet.** `package.json` reads `0.9.7`
95
+ on the release branch; no tag, registry version, or GitHub release corresponds
96
+ to it yet. This entry records an audit, a declaration sync, and the local
97
+ preparation of 0.9.7 — **not** a published release.
98
+
99
+ ### Previous decision — `dsh-v0.2.1-alpha.4`
100
+
101
+ - **Audited release:** `dsh-v0.2.1-alpha.4` (official release page:
102
+ <https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.2.1-alpha.4>),
103
+ published to npm 2026-10-15T13:08:08Z on the `alpha` dist-tag. It is **not**
104
+ `latest`; `latest`/`next` still point at `0.2.0-rc.2`, exactly as at alpha.3.
105
+ - **Comparison baseline:** `dsh-v0.2.1-alpha.3` (the previous audited tag).
106
+ - **Plugin runtime verdict: no break, and no `src/` change was needed.** Eight of
107
+ the ten peer packages ship a byte-identical `lib/` tree; only their
108
+ `package.json` `version` fields moved. That set includes `dsh-api-gateway`,
109
+ where alpha.3's first two breaks lived, and all three Client faces the resident
110
+ interaction client loads (`dsh-typert-registry/client`,
111
+ `dsh-client-connection/client`, `dsh-api-gateway/client`). Every alpha.3 fix
112
+ therefore still holds unchanged.
113
+ - **Only `dsh-api-remotes` changed in code, additively.** One new Remote Events
114
+ entry (`plugin-market/changed`) and the rename of `IncompatiblePlugin.peers` to
115
+ `requirements`. The plugin reads neither: it subscribes to no Remote Events
116
+ entry of that name, and its own phone-wire frame registry is a separate
117
+ vocabulary from DSH Remote Events. Its `lib/client.js` shows a 750-line diff
118
+ that normalises to zero contract changes — the bulk is `TYPERT_REMOTE$N`
119
+ renumbering plus `sourceLocation` line drift from the one inserted remote.
120
+ - **Two packages exist for the first time** — `@deepseek-ai/dsh-plugin-market`
121
+ and `@deepseek-ai/dsh-experimental-plugin-market-bundle` — behind this
122
+ release's custom plugin index sources. Neither is a dependency of this plugin,
123
+ the plugin does not name either in `inject`, and the bundle is a purely
124
+ additive entry in `dsh-app-boot`'s default bundle list.
125
+ - **Activation verdict: one break, and it is the release's own stated
126
+ migration.** alpha.4 changed the compatibility rule so that a plugin's own
127
+ `engines.dsh` range **decides alone and `peerDependencies` are ignored**
128
+ whenever that field is present; only a manifest without `engines.dsh` falls
129
+ back to the old peer evaluation. This plugin declared no `engines.dsh`, so it
130
+ kept the peer path, and its exact two-version peer list rejected
131
+ `0.2.1-alpha.4` — the plugin would not have activated on that host.
132
+ - **Evidence: reproduced against the published bundles, not inferred.** The audit
133
+ ran each host's own published `evaluatePluginCompatibility` (alpha.3 and
134
+ alpha.4 installed into separate isolated directories) against this plugin's
135
+ real `package.json`, over one candidate list. Before any edit, both hosts
136
+ admitted `0.2.0-rc.2` and `0.2.1-alpha.3` and both refused `0.2.1-alpha.4`,
137
+ reporting all ten peers unmet. With the new `engines.dsh` range in place, both
138
+ hosts admit all three audited releases; alpha.4 reports a **single**
139
+ `engines.dsh` requirement instead of ten peers when it refuses; and
140
+ `0.2.1-alpha.2`, `0.2.1-alpha.5`, `0.2.1`, and `0.3.0` are still refused.
141
+ *(Historical: `0.2.1-alpha.5` was admitted the next day by the audit above.)*
142
+ alpha.3 ignores `engines.dsh` entirely — the field did not exist yet — and
143
+ keeps deciding on `peerDependencies`, which is why both declarations must name
144
+ the same list.
145
+ - **Install verdict: the two declarations agreed at that point (widened since).**
146
+ `engines.dsh` and all ten `@deepseek-ai/dsh*` peers named `0.2.0-rc.2 ||
147
+ 0.2.1-alpha.3 || 0.2.1-alpha.4`, mirrored in
148
+ `tests/compatibility-metadata.test.ts`, `package-lock.json`, both
149
+ READMEs, `COMPATIBILITY.md`, `AGENTS.md`, and the local `docs/决策记录.md`
150
+ (章节一, 条目3). The dev pins and `DSH_BASELINE` stay at the exact
151
+ `0.2.0-rc.2` this branch builds and typechecks against. **Historical note:**
152
+ `0.2.1-alpha.5` was appended to both lists on 2026-10-16 by the audit above,
153
+ which now owns the current list; the four documentation mirrors that still
154
+ said「三个版本」were corrected there.
155
+ - **Vendor peers need no widening.** Both hosts still vendor `cordis
156
+ 4.0.5-alpha.2` and `schemastery 3.18.5-alpha.2`; neither package published a
157
+ `dsh-0-2-1-alpha-4` dist-tag, and the existing `~4.0.5-alpha.1` /
158
+ `~3.18.5-alpha.1` ranges already admit them.
159
+ - **Protocol verdict: no phone-protocol change.** Protocol v2, pairing state, and
160
+ device records are untouched by this release; no phone needs to re-pair.
161
+ - **Unrelated to this plugin, recorded for completeness:** the release also
162
+ brought per-model reasoning levels for custom API models, discovery and
163
+ installation from custom plugin index sources, a command/argument input fix, an
164
+ Office file delivery change, a Developer Tools reload fix, lower Linux command
165
+ startup overhead, and failed-command status reporting. None of them touches a
166
+ surface this plugin calls.
167
+
168
+ ### Previous decision — `dsh-v0.2.1-alpha.3`
7
169
 
8
170
  - **Audited release:** `dsh-v0.2.1-alpha.3` (official release page:
9
171
  <https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.2.1-alpha.3>),
@@ -115,17 +277,36 @@
115
277
 
116
278
  ### Plugin release verdicts
117
279
 
118
- - **Release candidate (`0.9.5`, 2026-10-15):** carries the alpha.3 Peer/client
119
- compatibility repair, the exact two-host peer policy, cross-language auth
120
- vectors and recovery guidance, and the manual OIDC/provenance workflow.
121
- The package and both lockfile version entries are `0.9.5`; the apply baseline
122
- records that version. Clean install, 562 passing unit tests (zero failures,
123
- one existing TODO), typecheck, build, the real pinned-host schema loader,
124
- Go tests, all six helper checksums, and package inspection pass locally.
125
- The altered-challenge test now mutates the challenge from its own socket,
126
- eliminating the timestamp collision, and passes 20 consecutive focused runs.
127
- Registry/provenance and clean published-profile checks remain release gates;
128
- no physical-iPhone validation is claimed. Notes: `docs/RELEASE_NOTES-0.9.5.md`.
280
+ - **发布结论(`0.9.5`,2026-10-15,`v0.9.5` @ `6517ad7`):** 包含 alpha.3
281
+ 对端(Peer)与客户端兼容修复、两个宿主精确列举策略、跨语言认证向量与恢复说明,
282
+ 以及手动 OIDC 身份认证与来源证明发布。包与锁文件两处根版本、基线快照一致。
283
+ - **发布前验证:** 干净依赖安装;562 项单元测试通过、零失败、一项既有待办;
284
+ 类型检查、构建、固定宿主的真实配置模型加载、Go 测试、六个辅助程序校验和与
285
+ 包内容检查通过。挑战篡改测试基于当前连接生成变更值,消除了时间碰撞,连续
286
+ 20 次重点回归通过。发布提交的持续集成(CI)和 CodeQL 代码安全扫描通过。
287
+ - **注册表与来源证明:** npm 于 `2026-10-14T23:29:29.605Z` 发布该版本,
288
+ `latest`(稳定分发标签)指向 `0.9.5`。下载压缩包共 50,934,088 字节,
289
+ SHA1 `6a2f356efa1e48849d9bf713f88cd0fd67c7999c` 与工作流上传记录一致;
290
+ SHA512 与注册表及来源证明中的包摘要一致。来源证明精确对应 `v0.9.5`、
291
+ `6517ad7b6d7022afc9b3d81d6779b434282c9c56` 和 `.github/workflows/publish.yml`。
292
+ `npm audit signatures`(npm 签名审计)通过,包含本插件的注册表签名和来源证明;
293
+ npm 可信发布者绑定显示 `Valid`(有效)。压缩包发布不依赖可选的 `gitHead`
294
+ 字段来确认源码,使用已验证签名的来源证明提交。
295
+ - **已发布包安装:** 两个独立的新 DSH 主目录分别使用 `0.2.0-rc.2` 与
296
+ `0.2.1-alpha.3`,从注册表执行 `dsh plugin --profile verify add dsh-deeppilot@0.9.5`。
297
+ 三条插件配置组合成功,版本为 `0.9.5`,安装路径未引用源码工作区,六个辅助程序
298
+ 校验和全部一致;实际配置模型导入未出现本插件相关错误。两个 Web 模板仍各有
299
+ 四项宿主配置模型错误,与未安装插件的基线完全一致;不把整个模板核对说成全绿。
300
+ - **真实宿主边界:** 隔离的 alpha.3 冒烟检查为 24 项通过、1 项失败、3 项跳过。
301
+ 失败项是未配置模型账号的全新主目录中,模型目录非空的断言;模型目录 RPC 正常
302
+ 且可路由。模型切换、真实提问和模型触发的审批问答未验证,iPhone 真机未验证。
303
+ 已认证连接重复提交认证证明的既有待办保留。
304
+ - **发布后缓存核对修正:** [首次发布运行](https://github.com/Mars-Sea/dsh-deeppilot/actions/runs/38653869533)
305
+ 上传成功,末尾核对短暂命中缓存的 404 而失败。独立注册表、摘要、签名及安装
306
+ 核验通过后才公开 [GitHub 发布页](https://github.com/Mars-Sea/dsh-deeppilot/releases/tag/v0.9.5)。
307
+ 后续仓库修正为刷新查询、要求元数据重新校验并最多读取重试 12 次;修正后的
308
+ 只读核对步骤已对真实注册表执行通过。未重跑上传、未修改已发布包或移动版本标签。
309
+ 发布说明:`docs/RELEASE_NOTES-0.9.5.md`。
129
310
 
130
311
  - **Release verdict (`0.9.4`, published 2026-10-10, tag `v0.9.4` @ `e2f77af`):**
131
312
  carries the `projections` adapter fix and the Automation tasks documentation
@@ -306,6 +487,248 @@
306
487
  bundle" below. The plugin needs no code change; the phone's copy now points
307
488
  at the bundle.
308
489
 
490
+ ## 2026-10-16 — audit of `dsh-v0.2.1-alpha.5`
491
+
492
+ The first release on this line whose entire plugin-facing change surface is
493
+ additive. It is the third consecutive release to trip the closed-list policy: a
494
+ new DSH tag refuses to activate this plugin until the list is widened by an
495
+ audit, which is the behaviour the 2026-10-14 reversal chose on purpose.
496
+
497
+ ### Method
498
+
499
+ The comparison used the **installed artifacts** of the alpha.4 and alpha.5 hosts
500
+ already unpacked on this machine, not release notes and not the monorepo: every
501
+ `@deepseek-ai/dsh*` peer package's `lib/` directory was compared file by file,
502
+ and the single differing file was then read as a diff. `dsh-client-ui-slots` is
503
+ not hoisted into either host's `node_modules` root (it resolves only inside a
504
+ composed profile), so both of its published versions were pulled from npm
505
+ (`0.2.1-alpha.4` and `0.2.1-alpha.5`, 31,973 bytes each) and compared in full to
506
+ close that gap rather than assume it.
507
+
508
+ ### Change surface
509
+
510
+ - **Nine of the ten peer packages carry a byte-identical `lib/` tree**:
511
+ `dsh`, `dsh-api-gateway`, `dsh-client-connection`, `dsh-client-locale`,
512
+ `dsh-client-ui-settings`, `dsh-client-ui-slots`, `dsh-settings`,
513
+ `dsh-typert-protocol`, `dsh-typert-registry`. The tenth is `dsh-api-remotes`.
514
+ - **`dsh-api-remotes/lib/client.js` — three hunks, 36 changed lines.** Every
515
+ hunk is the `account/getUnnotifiedBonuses` result schema:
516
+ - `title` is added, optional, described as a server-localised plain-text title
517
+ that absent responses replace with the localised bonus title.
518
+ - `campaign`, `amount`, `currency`, and `grantedAt` become optional; `campaign`
519
+ becomes unvalidated pass-through JSON, `amount` and `currency` lose their
520
+ string / `CNY|USD` constraints, and `grantedAt` loses its description.
521
+ - The JSON Schema side mirrors that: `title` is added to `properties`, and
522
+ `campaign`, `amount`, `currency`, and `grantedAt` are dropped from
523
+ `required`. `orderId`, `expiresAt`, and `message` remain required.
524
+ - **The exported symbols are unchanged**: the module assigns exactly
525
+ `exports.apply` and `exports.inject` on both sides.
526
+ - This plugin does not call `account/getUnnotifiedBonuses`, so even the field
527
+ that did tighten (`expiresAt`'s documented semantics) cannot reach it.
528
+ - **The vendor pins moved from prerelease to GA.** The `dsh` CLI's vendored
529
+ third parties went `cordis 4.0.5-alpha.2` → `4.0.5` and `schemastery
530
+ 3.18.5-alpha.2` → `3.18.5`. Both GA releases already satisfy the plugin's
531
+ existing `~4.0.5-alpha.1` / `~3.18.5-alpha.1` ranges, so **no vendor widening
532
+ was needed**; the ranges were left untouched.
533
+ - **The activation rule did not change again.** alpha.5 keeps alpha.4's
534
+ requirements path: a declared `engines.dsh` decides alone and short-circuits the
535
+ peer loop. That is why the refusal is reported as one requirement instead of
536
+ ten.
537
+
538
+ ### Validation evidence
539
+
540
+ - **Compatibility matrix against the published evaluator.** alpha.5's own
541
+ published `evaluatePluginCompatibility`, called with empty exemptions against
542
+ this plugin's real `package.json` over 13 candidates →
543
+ `.alpha5-verify/tmp-matrix-early.out.json`, `matrixAllPass: true`. Accepted:
544
+ `0.2.1-alpha.5` (the target), `0.2.1-alpha.3`, `0.2.1-alpha.4`, and the stable
545
+ host. Refused, each with `exempted: false`: `0.2.1-alpha.1`,
546
+ `0.2.1-alpha.2`, `0.2.0-rc.1`, `0.2.0`, `0.2.1-rc.1`, `0.2.1`, `0.3.0-rc.1`,
547
+ `0.3.0`, `1.0.0`, `0.1.7-rc.2`. The same file's `declarationSync` block
548
+ reports `engines.dsh === @deepseek-ai/dsh peer range`, all ten peers on one
549
+ range, and four unique `engines.dsh` tokens.
550
+ - **Pre-change baseline, the same evaluator.** `.alpha5-verify/stage1-baseline.out.json`
551
+ shows the unchanged declaration refusing `0.2.1-alpha.5` with
552
+ `requirements: { "engines.dsh": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4" }`
553
+ and `exempted: false` — the failure this audit removes.
554
+ - **Isolated alpha.5 host, pre-change.** `.alpha5-verify/VERIFICATION.md` and
555
+ `stage1-dumpconfig-phaseA.stderr.txt` record the real CLI refusing the plugin:
556
+ `dsh: skipping profile bundle "dsh-deeppilot": Error: Plugin
557
+ dsh-deeppilot@0.9.6 is incompatible with dsh 0.2.1-alpha.5: requirements
558
+ {"engines.dsh":…}`, `Exact-version exemption: not active`. The host still
559
+ booted (`stage1-host-phaseA.log`, `--port 3280`) and `/phone/health` returned
560
+ 404, which is what shows the plugin really was not loaded rather than silently
561
+ active.
562
+ - **Vendor semver, four independent paths.** `.alpha5-verify/stage1-semver-vendor.out.json`
563
+ resolves the two vendor ranges with the host tree's `semver` and the repo's
564
+ `semver`, each with and without `includePrerelease`; all four agree that
565
+ `4.0.5` and `3.18.5` (and the previously audited `4.0.4`, `4.0.5-alpha.2`,
566
+ `3.18.4`, `3.18.5-alpha.2`) satisfy, and that `9.9.9` does not.
567
+ - **Targeted unit test.** `node --import tsx --test tests/compatibility-metadata.test.ts`
568
+ → 5 tests, 5 pass, 0 fail, after `DSH_PEER_RANGE`, `DSH_ENGINES_RANGE`,
569
+ `DSH_ALPHA_HOSTS`, the rejection lists, and the vendor pins were updated. The
570
+ test file's contrast set still refuses `0.2.1-alpha.1`, `0.2.1-alpha.2`,
571
+ `0.2.0`, `0.2.1-rc.1`, `0.2.1`, `0.3.0`, and `1.0.0`, so the widening did not
572
+ turn into an open range.
573
+
574
+ ### Verification status
575
+
576
+ - **C7 — real load on an isolated alpha.5 host: passed.** The same isolated
577
+ profile that was refused before the widening now composes and starts: no
578
+ `skipping profile bundle` warning (0 bytes on stderr, was 21 lines), the tree
579
+ contains `# == dsh-deeppilot` and the web-app patch, the host logs four
580
+ `[deeppilot]` lines, and `https://127.0.0.1:3098/phone/health` answers `200`
581
+ with `serverVersion` matching the tree under test. The run happened before the
582
+ version bump, so that field read `0.9.6`; the release tree differs from the tree
583
+ under test only in the declaration documents and the version fields. Port 3098 —
584
+ not DSH's web port — is the probe with discriminating power; see the note under
585
+ Current decision.
586
+ - **The full check set for this tree (C5/C6): passed.** Clean `npm ci`, repo-wide
587
+ `npm test` (564 tests, 563 pass, 0 fail, 1 pre-existing TODO),
588
+ `npm run typecheck`, `npm run build` with a byte-identical regenerated `lib/`,
589
+ `npm run check:config-schema` against the pinned `0.2.0-rc.2` CLI, the Go helper
590
+ tests, and the six `bin/SHA256SUMS` entries.
591
+ - **No release action yet.** `package.json` reads `0.9.7` on the release branch;
592
+ nothing was published, tagged, or pushed. The widened list reaches users only
593
+ through that release.
594
+ - **The declaration mirrors have drifted historically.** `README.md`,
595
+ `README.zh-CN.md`, `COMPATIBILITY.md`, and `AGENTS.md` all said "three
596
+ releases" while `package.json` already named four; that contradiction was
597
+ corrected in this pass. Any future widening must update all of them together —
598
+ the unit test only pins `package.json` and `package-lock.json`.
599
+
600
+ ## 2026-10-15 — audit of `dsh-v0.2.1-alpha.4`
601
+
602
+ `dsh-v0.2.1-alpha.4` reached npm on 2026-10-15T13:08:08Z, roughly 24 hours after
603
+ alpha.3, with the GitHub release following at 13:40:02Z. It is a small release —
604
+ two features, five fixes, and one compatibility-policy change — and
605
+ `latest`/`next` still point at `0.2.0-rc.2`.
606
+
607
+ ### Method
608
+
609
+ This audit established the change surface from **released artifacts before
610
+ reading any source**, rather than from the release notes, because those notes are
611
+ under 2 KB and all four of alpha.3's breaks had been invisible in its notes.
612
+ Every `@deepseek-ai/dsh*` peer package was fetched from npm at both
613
+ `0.2.1-alpha.3` and `0.2.1-alpha.4`, unpacked into a scratch tree, and compared
614
+ file by file. The one large diff was then re-compared after normalising
615
+ `TYPERT_REMOTE$N` renumbering and `sourceLocation` line/column drift, so that
616
+ mechanical churn could not hide a contract change.
617
+
618
+ ### Change surface
619
+
620
+ - **Eight of the ten peer packages carry a byte-identical `lib/` tree**:
621
+ `dsh-api-gateway`, `dsh-client-connection`, `dsh-client-locale`,
622
+ `dsh-client-ui-settings`, `dsh-client-ui-slots`, `dsh-settings`,
623
+ `dsh-typert-protocol`, `dsh-typert-registry`. Only their `package.json`
624
+ `version` fields moved. That set includes every module alpha.3 broke the
625
+ plugin through.
626
+ - **`dsh-api-remotes`** gained one Remote Events entry (`plugin-market/changed`),
627
+ renamed `IncompatiblePlugin.peers` to `requirements`, and added a
628
+ `pluginMarket` remote. Its `lib/client.js` diff spans 750 lines but normalises
629
+ to zero contract changes — `TYPERT_REMOTE$N` renumbering, `sourceLocation`
630
+ drift, and one rewritten `productAnalytics/report` description.
631
+ - **`dsh-app-boot`** rewrote the compatibility evaluator (below) and appended
632
+ `@deepseek-ai/dsh-experimental-plugin-market-bundle` to its default bundle
633
+ list, which is additive to `DEFAULT_BUNDLES`.
634
+ - **`dsh-plugin-manager`** carried the same `peers` → `requirements` rename
635
+ through `IncompatiblePlugin` and its diagnostics.
636
+ - **Two packages are new at this release**: `@deepseek-ai/dsh-plugin-market` and
637
+ `@deepseek-ai/dsh-experimental-plugin-market-bundle`. Neither resolves at
638
+ alpha.3. Neither is a dependency of this plugin, and neither appears in its
639
+ `inject`.
640
+ - The `dsh` CLI's own ten `@deepseek-ai/dsh*` dependencies all moved to alpha.4;
641
+ the vendor pins did **not** move. Both hosts still vendor `cordis
642
+ 4.0.5-alpha.2` and `schemastery 3.18.5-alpha.2`, and neither vendor published a
643
+ `dsh-0-2-1-alpha-4` dist-tag, so the existing `~4.0.5-alpha.1` /
644
+ `~3.18.5-alpha.1` ranges already admit what both hosts ship.
645
+
646
+ ### The one break: `engines.dsh` now decides alone
647
+
648
+ `dsh-app-boot`'s evaluator grew a requirements path that short-circuits the old
649
+ peer loop:
650
+
651
+ ```js
652
+ function unmetRequirements(fields, runtimeVersion) {
653
+ const engines = Object.hasOwn(fields, "engines") ? objectOf$1(fields.engines, "Plugin manifest engines") : {};
654
+ if (Object.hasOwn(engines, "dsh")) {
655
+ const range = engines.dsh;
656
+ if (typeof range !== "string") throw new Error("Plugin manifest engines.dsh must be a string");
657
+ return satisfies(runtimeVersion, range) ? {} : { "engines.dsh": range };
658
+ }
659
+ if (!Object.hasOwn(fields, "peerDependencies")) return {};
660
+ // ...otherwise the previous per-peer loop, unchanged
661
+ }
662
+ ```
663
+
664
+ Three consequences matter here. A plugin that declares `engines.dsh` is judged
665
+ **only** by it, and its `peerDependencies` are never read. A plugin that does not
666
+ declare it keeps the previous behaviour — which is the state this plugin was in,
667
+ so its exact two-version peer list refused `0.2.1-alpha.4`. And `engines.dsh` is
668
+ taken verbatim, with none of the `workspace:^` / `workspace:~` / `workspace:*`
669
+ substitution the peer path performs, so any `workspace:` range there is unmet.
670
+
671
+ ### Validation evidence
672
+
673
+ - **Compatibility decision, reproduced against the published evaluators — before
674
+ any edit.** Each host's own `evaluatePluginCompatibility` (alpha.3 and alpha.4,
675
+ installed into separate isolated directories) judged this plugin's real
676
+ `package.json` over one candidate list. Unchanged, both hosts admitted
677
+ `0.2.0-rc.2` and `0.2.1-alpha.3` and refused `0.2.1-alpha.4`, listing all ten
678
+ peers as unmet. With the added `engines.dsh` range, both hosts admit all three
679
+ audited releases; alpha.4 reports a **single** `engines.dsh` requirement
680
+ instead of ten peers when it refuses; and `0.2.1-alpha.2`, `0.2.1-alpha.5`,
681
+ `0.2.1`, and `0.3.0` remain refused.
682
+ *(Historical: `0.2.1-alpha.5` was admitted the next day — see the audit of that
683
+ release above.)* alpha.3 ignores `engines.dsh` entirely and keeps deciding
684
+ on `peerDependencies`, which is why both declarations must name the same list.
685
+ - **Live A/B install on the published alpha.4 CLI — the evidence that matters.**
686
+ Under an isolated `DSH_HOME`, the **unchanged** package was rejected outright:
687
+ `dsh: installation rejected: Plugin dsh-deeppilot@0.9.5 is incompatible with
688
+ dsh 0.2.1-alpha.4: requirements {…ten peers…}`, `Exact-version exemption: not
689
+ active`, `dsh: nothing was installed`, exit 1. The **fixed** package installed
690
+ cleanly, exit 0, linked into the profile manifest's `dsh.profile.bundles`
691
+ alongside `@deepseek-ai/dsh-sdk-minimal`.
692
+ - **Composed tree:** the same CLI's `--dump-config` produced **162 rows with the
693
+ plugin and 153 without it**, the plugin's three rows present at
694
+ `deeppilot-directory-picker-browse`, `deeppilot-directory-picker-browse-client`,
695
+ and `deeppilot`, with no `skipped`/`incompatible` diagnostic. The single
696
+ warning is the `sdk-minimal` template's own missing `directory-picker` entry,
697
+ which alpha.3 recorded as well.
698
+ - **Live boot on a real alpha.4 Web host.** An isolated `DSH_HOME` profile built
699
+ from the shipped Web template and linked to this working tree booted under the
700
+ published alpha.4 CLI on `--port 3180` (the default 3080 is held by this
701
+ machine's own Host). The plugin started fully —
702
+ `[deeppilot] data plane active (mux + host streams)`,
703
+ `[deeppilot] LAN TLS identity created`,
704
+ `[deeppilot] local transport listening on https://0.0.0.0:3098` — and the
705
+ alpha.3 failure line `DSH Remote interaction client unavailable` **did not
706
+ appear**. A scan of the whole boot log for `incompatible`, `rejected`,
707
+ `requirements`, `unavailable`, or `error` returns nothing.
708
+ - **Plugin unit tests:** `npm test` → **564 tests, 563 pass, 0 fail, 1 todo**,
709
+ including the new `engines.dsh names the same closed host list as the peer
710
+ range` and the updated peer-range boundary test. `npm run typecheck` passes.
711
+ - **Build and schema:** `npm run build` passes and leaves `lib/` **byte-identical
712
+ to HEAD** — this fix changes no code, only declarations and documentation, so
713
+ no host's runtime behaviour can regress. `npm run check:config-schema` passes
714
+ against the pinned `0.2.0-rc.2` CLI (`/34 → $defs/config19`, volatile fields
715
+ pinned).
716
+ - **Environment note, not a defect:** `check:config-schema` shells out to
717
+ `npx --yes @deepseek-ai/dsh@0.2.0-rc.2`, and this machine's `~/.npm/_cacache`
718
+ contains root-owned files, so the default npm cache fails with `EPERM`. Running
719
+ it with `npm_config_cache` pointed at a writable directory passes, and the
720
+ unchanged HEAD build fails identically under the default cache, which is what
721
+ attributes the failure to the machine rather than to this change.
722
+
723
+ ### Evidence limits
724
+
725
+ Verified: install admission on alpha.4, profile composition, plugin startup, and
726
+ the full unit/typecheck/build/schema suite. **Not** verified here: a real iPhone
727
+ against this alpha.4 host, the Funnel transport, and a real model turn. The
728
+ phone-side contract is unchanged by this release — protocol v2, pairing state,
729
+ and device records are untouched, so no paired phone needs to re-pair — but that
730
+ is a source-level verdict, not a device run.
731
+
309
732
  ## 2026-10-14 — audit of `dsh-v0.2.1-alpha.3`
310
733
 
311
734
  ### Scope and method
@@ -72,8 +72,21 @@
72
72
  `npm whoami`(当前账号查询)不能验证 OIDC 发布权限。
73
73
  2. 若 npm 上传成功而后续核对失败,先检查注册表;已存在的版本不能通过重跑覆盖。
74
74
  排查来源证明或分发标签后再决定下一步,禁止把核对失败直接当作上传失败。
75
+ 发布核对会绕过元数据缓存并有限重试;人工查询使用 `npm view --prefer-online`,
76
+ 以免继续读取发布前的旧版本列表或缓存的 404 响应。
75
77
  3. 本地语法检查、测试和打包不能证明 npm 绑定已生效;真实 OIDC 认证与来源证明
76
78
  需要首次获授权的新版本发布才能验证。已有旧版本的认证状态不因新增工作流改变。
79
+ 4. `0.9.5` 已完成首次 OIDC 身份认证发布;npm 绑定显示 `Valid`(有效),
80
+ 来源证明签名、压缩包摘要与两个支持宿主的注册表安装核验通过。首次运行的末尾
81
+ 核对因缓存失败,其上传步骤成功;发布证据及边界见 `docs/DSH_RELEASE_MEMORY.md`。
82
+ 5. `0.9.6` 复现了同一形态:OIDC 上传与来源证明步骤成功,紧随其后的核对步骤在
83
+ 12 次重试后仍抛 `读取 npm 发布信息失败(dsh-deeppilot/0.9.6,HTTP 404)`,
84
+ 整次运行结论因此为失败。事后核验 `npm view dsh-deeppilot dist-tags --prefer-online`
85
+ 得到 `latest = 0.9.6`、发布时间与该版本的来源证明均齐全,确认根因是注册表元数据
86
+ 的可见性延迟,不是上传失败。该窗口已在 0.9.7 放宽:最多 24 次核对、间隔 5 秒
87
+ 线性递增并封顶 20 秒(约 7 分钟),仍然只读元数据、不重复上传包。这样既避免
88
+ 「上传成功 + 核对延迟」在 Actions 页留下误导性的红色结论,也不会把真正的失败
89
+ 伪装成成功——超出窗口依旧抛错。
77
90
 
78
91
  ## 五、官方资料
79
92
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-deeppilot",
3
- "version": "0.9.5",
3
+ "version": "0.9.7",
4
4
  "description": "DeepPilot companion plugin for DeepSeek Harness: use DSH from a native iPhone app over an authenticated, direct connection to your own computer.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -82,7 +82,8 @@
82
82
  "test": "tsx --test tests/*.test.ts"
83
83
  },
84
84
  "engines": {
85
- "node": ">=22"
85
+ "node": ">=22",
86
+ "dsh": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5"
86
87
  },
87
88
  "publishConfig": {
88
89
  "access": "public"
@@ -94,16 +95,16 @@
94
95
  },
95
96
  "peerDependencies": {
96
97
  "@deepseek-ai/cordis": "~4.0.4 || ~4.0.5-alpha.1",
97
- "@deepseek-ai/dsh": "0.2.0-rc.2 || 0.2.1-alpha.3",
98
- "@deepseek-ai/dsh-api-gateway": "0.2.0-rc.2 || 0.2.1-alpha.3",
99
- "@deepseek-ai/dsh-api-remotes": "0.2.0-rc.2 || 0.2.1-alpha.3",
100
- "@deepseek-ai/dsh-client-connection": "0.2.0-rc.2 || 0.2.1-alpha.3",
101
- "@deepseek-ai/dsh-client-locale": "0.2.0-rc.2 || 0.2.1-alpha.3",
102
- "@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.2 || 0.2.1-alpha.3",
103
- "@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2 || 0.2.1-alpha.3",
104
- "@deepseek-ai/dsh-settings": "0.2.0-rc.2 || 0.2.1-alpha.3",
105
- "@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.2 || 0.2.1-alpha.3",
106
- "@deepseek-ai/dsh-typert-registry": "0.2.0-rc.2 || 0.2.1-alpha.3",
98
+ "@deepseek-ai/dsh": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
99
+ "@deepseek-ai/dsh-api-gateway": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
100
+ "@deepseek-ai/dsh-api-remotes": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
101
+ "@deepseek-ai/dsh-client-connection": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
102
+ "@deepseek-ai/dsh-client-locale": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
103
+ "@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
104
+ "@deepseek-ai/dsh-client-ui-slots": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
105
+ "@deepseek-ai/dsh-settings": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
106
+ "@deepseek-ai/dsh-typert-protocol": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
107
+ "@deepseek-ai/dsh-typert-registry": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5",
107
108
  "@deepseek-ai/schemastery": "~3.18.4 || ~3.18.5-alpha.1",
108
109
  "react": "^19.2.8"
109
110
  },