dsh-deeppilot 0.9.8 → 0.9.11

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,9 +1,10 @@
1
1
  # Compatibility
2
2
 
3
- This branch targets exactly **five DSH releases**: `0.2.0-rc.2`, which the npm
4
- `latest` channel points at; `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; and
6
- `0.2.1-rc.2`, which the `next` channel points at. All five are
3
+ This branch targets exactly **six DSH releases**: `0.2.0-rc.2`; the `alpha`
4
+ channel releases `0.2.1-alpha.3`, `0.2.1-alpha.4`, and `0.2.1-alpha.5`; and the
5
+ `next` channel releases `0.2.1-rc.2` and `0.2.1-rc.3`. The npm channels have
6
+ moved since: `latest` now points at `0.2.1-rc.2`, promoted from `next`, and
7
+ `next` at `0.2.1-rc.3`. All six are
7
8
  named in both `engines.dsh` and `peerDependencies`; no other version is accepted.
8
9
  DSH evaluates that declaration before composing a profile — on every start, not
9
10
  only on install — so a newly published DSH release deactivates this plugin until
@@ -21,9 +22,10 @@ recorded in the release memory.
21
22
  | Component | Current contract | Evidence |
22
23
  |---|---|---|
23
24
  | Node.js | 22 or newer | Package engine and CI |
24
- | 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 \|\| 0.2.1-rc.2` (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, 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, and a pre-widening 0.2.1-rc.2 host run where the unchanged declaration is refused at compose time (audits below) |
25
+ | 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 \|\| 0.2.1-rc.2 \|\| 0.2.1-rc.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, 0.2.1-alpha.3, and 0.2.1-alpha.4 CLIs, 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, a pre-widening 0.2.1-rc.2 host run where the unchanged declaration is refused at compose time, and an isolated 0.2.1-rc.3 host where the widened declaration composes, starts, and answers `/phone/health` with 200 (audits below) |
25
26
  | iOS bridge | DeepPilot protocol v2 | Bridge protocol tests; device behavior must be checked with the running Host and app |
26
27
  | Remote access | Tailscale Funnel on ports 443, 8443, or 10000 | Helper and supervisor tests |
28
+ | Funnel helper platforms | macOS 13 Ventura or later, Linux, and Windows, each on amd64/arm64; built with Go 1.27, which dropped macOS 12 | CI starts the committed helper on a native runner for each of the six targets (`helper-smoke`); no runner covers macOS 13 itself |
27
29
 
28
30
  ## DSH interfaces used here
29
31
 
@@ -73,6 +75,77 @@ carries the old top-level `debug: true` is accepted but that value is ignored:
73
75
  verbose logging must be turned on again from the settings page. No other config
74
76
  field changed shape, and the old key is not read anywhere in this version.
75
77
 
78
+ ## 0.2.1-rc.3 audit outcome
79
+
80
+ The artifact-level audit of `dsh-v0.2.1-rc.3` (published to the npm registry
81
+ 2026-10-23T07:54:30Z, the `next` channel release; `latest` points at `0.2.1-rc.2`)
82
+ against `dsh-v0.2.1-rc.2` found **no change that reaches this plugin's call
83
+ surface**. Nineteen packages were compared as whole trees rather than by `lib/`
84
+ alone — eighteen from the two installed trees plus
85
+ `@deepseek-ai/dsh-client-ui-slots` (the seventh declared `dsh-*` peer, absent from
86
+ both trees) through its registry tarball:
87
+
88
+ - **Fourteen packages differ only in `package.json`** — version and dependency
89
+ specs — so every file those hosts read at runtime is byte-identical.
90
+ - **Three packages carry one non-`package.json` change each** — `dsh-api-remotes`,
91
+ `dsh-api-session-controller`, and `dsh-web-app` — detailed below.
92
+ - **`cordis 4.0.5` and `schemastery 3.18.5` are byte-identical including
93
+ `package.json`**, so the vendor peer ranges need no widening again.
94
+ - **The tree gains one package**: `rc.2` ships 306 packages and `rc.3` 307; the
95
+ addition is `@deepseek-ai/dsh-client-ui-entry-customization@0.2.1-rc.3`, the
96
+ bundle behind the More menus. This plugin neither references it nor depends on
97
+ it through its own patch.
98
+
99
+ Of 3,302 shared files, 3,275 are byte-identical and 20 differ: 16 `package.json`
100
+ files, the three code/config files above, and the `dsh-client-ui-slots`
101
+ `package.json`. Across 274 analysed modules **no export symbol is added or
102
+ removed** (18 entry modules compared), so every earlier fix still holds
103
+ unchanged. The manifest delta over 19 packages covers 585 paths — 17 version
104
+ bumps and 568 dependency-spec moves, **zero structural differences** — with no
105
+ package added or removed by dependency resolution.
106
+
107
+ **The one file outside `package.json` that could reach this plugin's patch layer
108
+ is additive.** `@deepseek-ai/dsh-web-app/cordis.patch.yml` gained one hunk that
109
+ inserts the `ui-entry-customization` bundle (the More menus named in the rc.3
110
+ release notes). The patch anchor this plugin targets, `id: directory-picker`, is
111
+ byte-identical on both sides at the same offsets, and neither the new package
112
+ name nor `entry-customization` appears in this plugin's `cordis.patch.yml` or
113
+ `package.json`, so the change cannot reach any patch this plugin applies.
114
+
115
+ The other two non-`package.json` files are equally out of reach:
116
+ `@deepseek-ai/dsh-api-remotes/lib/client.js` only widens the client telemetry
117
+ event schema (`is_new_session`, `agent_preset`, and the More-menu and
118
+ agent-preset switch events), which this plugin neither emits nor validates, and
119
+ `@deepseek-ai/dsh-api-session-controller`'s
120
+ `lib/types/client/sessions/service.d.ts` changes a doc comment only.
121
+
122
+ The activation verdict repeats the rc.2 shape: rc.3 also reads `engines.dsh`
123
+ alone. Before the widening, the published rc.3 evaluator refused `0.2.1-rc.3`
124
+ with a single `engines.dsh` requirement and `exempted: false`, and a real rc.3
125
+ CLI reproduced the refusal at compose time (`skipping profile bundle
126
+ "dsh-deeppilot"`) while the host itself still booted and served its web port.
127
+ After the widening, the same evaluator admits exactly `0.2.1-rc.3` and adds no
128
+ other acceptance: the five earlier hosts stay admitted, and `0.2.1-rc.1`,
129
+ `0.2.1-rc.3.1`, `0.2.1-rc.30`, `0.2.1-RC.3`, `0.2.1`, `0.2.1-rc.2.1`, `0.2.0`,
130
+ `0.3.0`, and `1.0.0` remain refused. Deleting `engines.dsh` from a copy of the
131
+ manifest falls back to the ten peers and still admits the same six hosts, so the
132
+ short-circuit is unchanged.
133
+
134
+ **The positive half is complete this time.** An isolated `0.2.1-rc.3` host — its
135
+ own `DSH_HOME`, the plugin linked from this working tree, and no other plugin —
136
+ composes the plugin into the tree, starts it, and answers `/phone/health` with
137
+ 200 on the plugin's own LAN listener (`serverVersion` `0.9.10`, protocol v2),
138
+ while the isolated home gains the plugin's data directory. The same profile run
139
+ with the declaration unchanged shows the skip line instead and no listener,
140
+ which is what makes the pair discriminative.
141
+
142
+ Evidence: `.rc3-verify/AUDIT.md` and `.rc3-verify/CHANGE_SURFACE.md` with the raw
143
+ logs under `.rc3-verify/logs/`, the evaluator reproduction in
144
+ `.rc3-verify/evaluator-repro.out.json`, the acceptance matrix in
145
+ `.rc3-verify/matrix.out.json`, the export-symbol diff in
146
+ `.rc3-verify/export-symbol-diff.out.json`, and the host run in
147
+ `.rc3-verify/HOST-BOOT.md`.
148
+
76
149
  ## 0.2.1-rc.2 audit outcome
77
150
 
78
151
  The artifact-level audit of `dsh-v0.2.1-rc.2` against `dsh-v0.2.1-alpha.5` found
package/README.md CHANGED
@@ -32,19 +32,23 @@ 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 five DSH releases it has been
36
- audited against — `0.2.0-rc.2` (the `latest` channel), the `alpha` channel
37
- releases `0.2.1-alpha.3`, `0.2.1-alpha.4`, and `0.2.1-alpha.5`, and `0.2.1-rc.2`
38
- (the `next` channel) — with a `web` profile. DSH checks a plugin's declared
35
+ This source checkout targets Node.js 22+ and the six DSH releases it has been
36
+ audited against — `0.2.0-rc.2`, the `alpha` channel releases `0.2.1-alpha.3`,
37
+ `0.2.1-alpha.4`, and `0.2.1-alpha.5`, and the two `next` channel releases it has
38
+ admitted in turn, `0.2.1-rc.2` and `0.2.1-rc.3` — with a `web` profile. (The
39
+ npm channels move: `latest` now points at `0.2.1-rc.2`, which was promoted
40
+ from `next`, and `next` at `0.2.1-rc.3`.) DSH checks a plugin's declared
39
41
  requirements before composing a profile, on every start rather than only on
40
42
  install, so any other host version refuses to activate this plugin. From DSH
41
43
  `0.2.1-alpha.4` on, that check reads `engines.dsh` and ignores
42
44
  `peerDependencies`; older hosts know only the peer range, so both name the same
43
- five releases. The package includes Funnel helpers
45
+ six releases. The package includes Funnel helpers
44
46
  for macOS, Linux, and Windows on amd64/arm64; trusted-LAN mode does not require
45
- the helper.
47
+ the helper. The helper is built with Go 1.27, which requires **macOS 13 Ventura
48
+ or later**: on macOS 12 and earlier, Funnel mode cannot start, while
49
+ trusted-LAN mode keeps working.
46
50
 
47
- The current working tree names exactly those five versions in `engines.dsh` and
51
+ The current working tree names exactly those six versions in `engines.dsh` and
48
52
  `peerDependencies` and is built/typechecked against `0.2.0-rc.2`. A previously
49
53
  published plugin package may still carry its own older compatibility
50
54
  declaration until a release is made from this tree.
@@ -125,10 +129,30 @@ system-reported name; saving an empty value restores the iPhone-reported
125
129
  default.
126
130
 
127
131
  The settings page's **Testing & troubleshooting** group has a `debug` toggle.
128
- Turning it on prints handshake and push diagnostics to the DSH host's terminal
132
+ Turning it on prints per-frame and push diagnostics to the DSH host's terminal
129
133
  output (for example, the actual capability bits sent in `s2c.welcome`); it
130
- never prints pairing tokens, APNs tokens, or message content, and takes effect
131
- immediately without restarting DSH.
134
+ never prints pairing tokens, APNs tokens, or message content. The toggle is
135
+ snapshotted per connection, so an already-open connection only picks up the new
136
+ value after it reconnects.
137
+
138
+ **Connection failures do not need that toggle.** The plugin always records
139
+ admission rejections, authentication failures (4401 distinguishes an unknown
140
+ device, a revoked device, a bad signature, an expired challenge and clock skew),
141
+ TLS handshake failures and pairing failures. They show up in the terminal as
142
+ `[deeppilot] <time> WARN <event> <reason> src=<source hash> attempt=<attempt ID>`
143
+ and are appended under `diagnostics/` in the plugin data directory (7 days,
144
+ 5 MB cap). The settings page's **Connection diagnostics** group lists the most
145
+ recent failures with a copy button, and `/phone/health` additionally returns the
146
+ local transport phase and port, the data-plane phase, whether the TLS identity
147
+ was rebuilt, the start time and the last failure, so the phone can locate the
148
+ cause even while it cannot connect. Records contain only source hashes — never
149
+ raw IPs, pairing codes, keys, APNs tokens or message content.
150
+
151
+ Each connection attempt from the phone carries a random `attemptId` (the `?at=`
152
+ query parameter on the WebSocket upgrade, or the `X-DeepPilot-Attempt` header on
153
+ pairing and health checks). The plugin writes it into the log lines and
154
+ diagnostic events above, so a user reporting that ID lets you find the exact
155
+ attempt in the host log.
132
156
 
133
157
  Offline push is optional. Relay mode sends only the target APNs device token
134
158
  and a limited notification payload; full conversation history and live output
package/README.zh-CN.md CHANGED
@@ -30,17 +30,20 @@
30
30
 
31
31
  ## 从 npm 安装
32
32
 
33
- 当前源码面向 Node.js 22+ 与带 `web` profile 的**五个已审计 DSH 版本**:
34
- `0.2.0-rc.2`(`latest` 通道)、`alpha` 通道的 `0.2.1-alpha.3`、
35
- `0.2.1-alpha.4` 与 `0.2.1-alpha.5`,以及 `0.2.1-rc.2`(`next` 通道)。
33
+ 当前源码面向 Node.js 22+ 与带 `web` profile 的**六个已审计 DSH 版本**:
34
+ `0.2.0-rc.2`、`alpha` 通道的 `0.2.1-alpha.3`、
35
+ `0.2.1-alpha.4` 与 `0.2.1-alpha.5`,以及先后两版 `next` 通道的
36
+ `0.2.1-rc.2` 与 `0.2.1-rc.3`(npm 通道会移动:`latest` 现指向由 `next` 转正的
37
+ `0.2.1-rc.2`,`next` 指向 `0.2.1-rc.3`)。
36
38
  DSH 在组合 profile 前会校验插件声明的
37
39
  兼容要求,且**每次启动都会校验**(不只是安装时),因此其他宿主版本会拒绝
38
40
  激活本插件。从 DSH `0.2.1-alpha.4` 起,该校验只读 `engines.dsh` 并忽略
39
- `peerDependencies`;更早的宿主只认 peer 范围,因此两处列出同一组五个版本。
41
+ `peerDependencies`;更早的宿主只认 peer 范围,因此两处列出同一组六个版本。
40
42
  npm 包内置 macOS、Linux、Windows 的 amd64/arm64 Funnel helper;可信局域网
41
- 模式不依赖 helper。
43
+ 模式不依赖 helper。helper 用 Go 1.27 编译,要求 **macOS 13 Ventura 或更高版本**:
44
+ macOS 12 及更早版本无法启动 Funnel 模式,可信局域网模式不受影响。
42
45
 
43
- 当前工作树的 `engines.dsh` 与 `peerDependencies` 精确列出这五个版本,构建与
46
+ 当前工作树的 `engines.dsh` 与 `peerDependencies` 精确列出这六个版本,构建与
44
47
  类型检查针对 `0.2.0-rc.2`。从此工作树发布新版本前,已发布的旧插件包仍可能
45
48
  带有各自旧的兼容声明。
46
49
 
@@ -108,8 +111,21 @@ DeepPilot 设置页提供“每个公网来源的连接上限”,默认 `8`,
108
111
  也不会被覆盖。留空保存可恢复 iPhone 上报的默认名称。
109
112
 
110
113
  设置页的“测试与故障排查”分组下有一个 `debug` 开关,打开后会在 DSH host 的
111
- 终端输出里打印握手、推送等诊断信息(例如 `s2c.welcome` 里实际发出的能力位),
112
- 不会打印配对令牌、APNs token 或消息内容;改这个开关立即生效,不需要重启 DSH。
114
+ 终端输出里打印逐帧与推送等诊断信息(例如 `s2c.welcome` 里实际发出的能力位),
115
+ 不会打印配对令牌、APNs token 或消息内容。该开关按连接快照,已建立的连接需要
116
+ 重连一次才按新值工作。
117
+
118
+ **连不上时不需要打开这个开关**:插件会无条件记录准入拒绝、认证失败(4401 会区分
119
+ 设备不存在、已撤销、签名错、挑战过期、时钟偏差等原因)、TLS 握手失败与配对失败,
120
+ 在终端输出为 `[deeppilot] <时间> WARN <事件> <原因> src=<来源哈希> attempt=<尝试 ID>`,
121
+ 并落盘到插件数据目录的 `diagnostics/`(保留 7 天、上限 5 MB)。设置页“连接诊断”
122
+ 分组可查看最近失败并一键复制;`/phone/health` 额外返回本地传输相位与端口、数据面
123
+ 相位、是否重建过 TLS 身份、启动时间与最近一次失败,手机端在连不上时也能据此定位。
124
+ 记录只含来源哈希,不含原始 IP、配对码、密钥、APNs token 或消息内容。
125
+
126
+ 手机端每次连接尝试会带一个随机的 `attemptId`(WebSocket 升级的 `?at=` 查询参数,
127
+ 或配对/健康检查的 `X-DeepPilot-Attempt` 请求头)。插件把它写进上面的日志与诊断
128
+ 事件;用户反馈时报告这个 ID,就能在主机日志里定位到同一次尝试。
113
129
 
114
130
  离线推送是可选功能。中继模式只发送目标 APNs 设备 Token 和有限的通知内容;
115
131
  完整会话历史与实时输出不会经过中继。启用远程访问或推送前,请阅读
package/bin/SHA256SUMS CHANGED
@@ -1,6 +1,6 @@
1
- c70401fd9530f2fae6abe7aec5eacacca239ba315cedc7197db530df8c6f97bd ./darwin-amd64/dsh-deeppilot-tunnel
2
- 45ff6b53d3e27fe6242e4904055d647d8b220a5c56ca76e542ffcd861ad3bbad ./darwin-arm64/dsh-deeppilot-tunnel
3
- 8d4937de90564327dcf8392dba6241e4facc30044a48447b22de99f3e62c9808 ./linux-amd64/dsh-deeppilot-tunnel
4
- cd4638f9aa3e60340d4f446301b2b6f6452f5cb89fc012884e5a893ab8dbd577 ./linux-arm64/dsh-deeppilot-tunnel
5
- d5435d4e0c02056b3fac39a5f289acb404e6f060dc566e5dea724ee2b86a4296 ./windows-amd64/dsh-deeppilot-tunnel.exe
6
- 7d79c848b2b74286764bd284005edbcfdf539be90ce0b160ea464ae3af70e005 ./windows-arm64/dsh-deeppilot-tunnel.exe
1
+ 0e49860ffd7b6fd9ba5918481cbfa2fc0a788f0c16d500de69a162d31451d526 ./darwin-amd64/dsh-deeppilot-tunnel
2
+ 16e0b6235cb097401dc52840f11c0dcf405925d23449934cdfea93ec89c071e9 ./darwin-arm64/dsh-deeppilot-tunnel
3
+ ed3d60db2da2f3c17a5f7d04834faf4623a955ecc48a3aa0497c3903df8a2bce ./linux-amd64/dsh-deeppilot-tunnel
4
+ b5e85cd9f9f928f4204cfc15067588d1c3dcdc683a5f5b85759d5454bce2110e ./linux-arm64/dsh-deeppilot-tunnel
5
+ 836126376d0da12abc6bafb3ed163138436f812b201bd254eb1c7cae3f8a34c7 ./windows-amd64/dsh-deeppilot-tunnel.exe
6
+ 6b74d0f4b73f9f53b01829a84abd178c17a64950c1e9949b8fae15ef274fb99f ./windows-arm64/dsh-deeppilot-tunnel.exe
@@ -3,7 +3,97 @@
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 — `dsh-v0.2.1-rc.2`
6
+ ## Current decision — `dsh-v0.2.1-rc.3`
7
+
8
+ - **Audited release:** `dsh-v0.2.1-rc.3`, published to the npm registry
9
+ 2026-10-23T07:54:30Z (GitHub Release 2026-10-23T15:26:39Z), and the **`next`**
10
+ channel release — `next` moved from `0.2.1-rc.2` to it, so this is the second
11
+ consecutive rc on that line to enter the supported list, each on its own audit.
12
+ It is **not** `latest`: the registry currently reads `latest = 0.2.1-rc.2`
13
+ (rc.2, promoted from `next`) and `alpha = 0.2.1-alpha.5`. This audit therefore also
14
+ corrected the older channel attribution that called `0.2.0-rc.2` the `latest`
15
+ channel in `AGENTS.md` and both READMEs — the list of six admitted hosts is
16
+ unchanged by that correction, only its description.
17
+ - **Comparison baseline:** `dsh-v0.2.1-rc.2` (the previous audited tag).
18
+ - **Plugin runtime verdict: no break, and no `src/` change was needed.**
19
+ Nineteen packages were compared **as whole trees, not by `lib/` alone** —
20
+ eighteen from the two installed trees plus `dsh-client-ui-slots` (the seventh
21
+ declared `dsh-*` peer, absent from both) through its registry tarball. Fourteen
22
+ differ only in `package.json`, three carry one further file each, and
23
+ `cordis 4.0.5` / `schemastery 3.18.5` are byte-identical including
24
+ `package.json`. Of 3,302 shared files, 3,275 are byte-identical and 20 differ.
25
+ The tree count moves 306 → 307 with the new
26
+ `@deepseek-ai/dsh-client-ui-entry-customization@0.2.1-rc.3`, the More-menu bundle
27
+ the web-app patch now references; this plugin neither references it nor depends
28
+ on it. Across 274 modules **no export symbol is added or removed** (18 entry
29
+ modules compared), so every earlier fix still holds unchanged. The manifest
30
+ delta over 19 packages covers 585 paths — 17 version bumps and 568
31
+ dependency-spec moves — with **zero structural differences**.
32
+ - **The three non-`package.json` files are additive or comment-only.**
33
+ `@deepseek-ai/dsh-api-remotes/lib/client.js` widens the client telemetry event
34
+ schema (`is_new_session`, `agent_preset`, and the More-menu / agent-preset
35
+ switch events), data this plugin neither emits nor validates.
36
+ `@deepseek-ai/dsh-api-session-controller`'s
37
+ `lib/types/client/sessions/service.d.ts` changes a doc comment only.
38
+ `@deepseek-ai/dsh-web-app/cordis.patch.yml` gains one hunk inserting the
39
+ `ui-entry-customization` bundle (the More menus named in the rc.3 release
40
+ notes); the patch anchor this plugin targets, `id: directory-picker`, is
41
+ byte-identical on both sides at the same offsets, and neither the new package
42
+ name nor `entry-customization` appears in this plugin's `cordis.patch.yml` or
43
+ `package.json`.
44
+ - **Activation verdict: the new release is admitted by both declarations, and the
45
+ earlier rc stays out.** rc.3, like rc.2, reads a declared `engines.dsh` alone,
46
+ so before the widening its refusal reported a **single** `engines.dsh`
47
+ requirement and `exempted: false` — no profile exemption file exists on this
48
+ machine — and a real rc.3 CLI reproduced it (`skipping profile bundle
49
+ "dsh-deeppilot"`) while the host itself still booted and served its web port.
50
+ Widening admits `0.2.1-rc.3` and nothing else: `0.2.1-rc.1` was never audited as
51
+ its own host, so it stays refused, as do `0.2.1-rc.3.1`, `0.2.1-rc.30`,
52
+ `0.2.1-RC.3`, `0.2.1`, `0.2.1-rc.2.1`, `0.2.0`, `0.3.0`, and `1.0.0`. Deleting
53
+ `engines.dsh` from a copy of the manifest falls back to the ten peers and admits
54
+ the same six hosts, so the short-circuit is unchanged.
55
+ - **Evidence: the published artifacts, the published evaluator, and a real rc.3
56
+ CLI run — all taken before any declaration changed.**
57
+ - **Change surface:** `.rc3-verify/CHANGE_SURFACE.md` and
58
+ `.rc3-verify/AUDIT.md`, with raw logs under `.rc3-verify/logs/`
59
+ (`master-table.txt`, `file-hash-compare.txt`, `diff-rq.all.txt`,
60
+ `patch-anchor-check.stdout.txt`), plus `tree-compare.out.json` (the
61
+ 16-package whole-tree comparison), `export-symbol-diff.out.json` (274
62
+ modules, zero surface deltas), `pkg-manifest-delta.out.json` (585 paths, all
63
+ version or dependency-spec values) and `patch-anchor-check.out.json` (the one
64
+ patch-file change and its anchor).
65
+ - **Activation decision, reproduced against rc.3's own published evaluator
66
+ before any edit:** `.rc3-verify/evaluator-repro.out.json` shows the unchanged
67
+ manifest refused with one `engines.dsh` requirement and `exempted: false`, and
68
+ the worktree manifest admitted; `.rc3-verify/matrix.out.json` projects the
69
+ widening over 15 candidates — before accepted 5, after accepted 6, **newly
70
+ accepted exactly `0.2.1-rc.3`, newly rejected 0**.
71
+ - **Real CLI refusal and real CLI load.** The refusal was captured from the
72
+ installed rc.3 CLI before the declaration changed; after the widening the same
73
+ CLI composes the plugin (`--dump-config`, exit 0, no skip line).
74
+ - **Positive load verified this time.** An isolated `0.2.1-rc.3` host — its own
75
+ `DSH_HOME` in a one-off scratch directory (since deleted), the plugin linked
76
+ from this working tree, and no other plugin — composed the plugin into the
77
+ tree, started it, and answered `https://127.0.0.1:3098/phone/health` with `200`:
78
+ `{"ok":true,"enabled":true,"protocolVersion":2,"serverVersion":"0.9.10","dataPlane":true}`
79
+ while the isolated home gained `deeppilot/host-id` and `deeppilot/lan-tls/`.
80
+ Evidence: `.rc3-verify/HOST-BOOT.md` (written after the audit directory was
81
+ handed over) with the raw log and probe output beside it.
82
+ - **Check set run (nothing published).** `npm test` (609 pass, 0 fail),
83
+ `typecheck`, `build` (committed `lib/` unchanged), `check:config-schema`, and
84
+ `smoke:helper` (darwin-arm64). One environment note carries forward: the
85
+ default npm cache on this machine holds root-owned files, so the
86
+ `check:config-schema` script's `npx` invocation fails with `EPERM` until
87
+ `npm_config_cache` points at a writable directory; with that variable set the
88
+ check passes. No `npm ci`, no commit, no push, no tag, and no npm publish: the
89
+ release is prepared but not shipped.
90
+ - **Not covered / limits.** No real iPhone run, no Funnel end-to-end, no
91
+ model-backed turn against this host. `npm ci` and the helper-matrix rebuild
92
+ steps were skipped because no helper, dependency, or source input changed; CI
93
+ rebuilds the matrix and fails on any `bin/` drift. The widening is a metadata
94
+ and documentation change only.
95
+
96
+ ### Previous decision — `dsh-v0.2.1-rc.2`
7
97
 
8
98
  - **Audited release:** `dsh-v0.2.1-rc.2`, published 2026-10-17T08:36:31.655Z. It is
9
99
  **not** `latest`: `latest` still points at `0.2.0-rc.2`, and `alpha` still points
@@ -87,12 +177,61 @@
87
177
  `0.2.0-rc.2` this branch builds and typechecks against.
88
178
  - **Protocol verdict: no phone-protocol change.** Protocol v2, pairing state, and
89
179
  device records are untouched by this release; no phone needs to re-pair.
90
- - **Audit limits, stated rather than implied.** The positive half of the rc.2
91
- verification — loading this plugin on a real isolated `0.2.1-rc.2` host after the
92
- widening — had **not** been completed when this entry was written, and neither had
93
- the full release check set against that host. Until they run, rc.2 is recorded as
94
- audited at the artifact-diff and declaration level only; no plugin release has
95
- been made from this tree.
180
+ - **The limits this entry originally stated are now closed.** The positive half of
181
+ the rc.2 verification ran before publication: on an isolated `0.2.1-rc.2` host
182
+ carrying the widened declaration, `--dump-config` wrote nothing to stderr, the
183
+ composed tree contained `# == dsh-deeppilot` (line 1233) together with
184
+ `# == @deepseek-ai/dsh-web-app, patched by dsh-deeppilot` (line 449), the running
185
+ host logged four `[deeppilot]` lines, and the plugin's own LAN listener on port
186
+ 3098 answered `/phone/health` with `200` and `serverVersion` `0.9.8`. A tamper
187
+ control removed the `0.2.1-rc.2` token from a copy of `engines.dsh`: the host
188
+ refused again with the single `engines.dsh` requirement (`exempted: false`) and
189
+ accepted it once restored. Independent verification of the whole release tree —
190
+ `npm ci`, 581 tests (580 pass, 0 fail, 1 pre-existing TODO), typecheck, build
191
+ with a byte-identical regenerated `lib/`, `check:config-schema`, the Go helper
192
+ tests, and all six `bin/SHA256SUMS` entries — is recorded in
193
+ `.rc2-verify/VERIFICATION.md`; that pass also caught a real defect, a version
194
+ bump that had left `tests/apply-baseline.snapshot.json` stale.
195
+ - **Published as 0.9.8 on 2026-10-18.** The annotated tag `v0.9.8` dereferences to
196
+ `f4551b61602e5e60b11565ae31ccba3257d3dc9e` on `main`, CI and CodeQL were green on
197
+ that commit, and `publish.yml` ran on the tag (run `39048037503`, 24/24 steps).
198
+ The registry records `latest: 0.9.8`, published `2026-10-17T16:12:59.699Z`, with a
199
+ `https://slsa.dev/provenance/v1` attestation naming that commit as its source. The
200
+ published tarball's SHA1 `8288977711e04679d077b970f863e726631fc309` and its SHA512
201
+ match the registry, its 68 entries and 130,945,335 unpacked bytes match the
202
+ pre-publication pack, and every packaged file compared byte-identically with the
203
+ verified tree. A clean isolated profile then installed `dsh-deeppilot@0.9.8` from
204
+ npm, composed it on a real `0.2.1-rc.2` host, and answered `/phone/health` with
205
+ `200` and `serverVersion: "0.9.8"`; the GitHub Release was made public only after
206
+ that install verification. The same release shipped the mobile skills, host
207
+ commands, and catalog-cache work recorded below.
208
+ - **Published as 0.9.9 on 2026-10-21.** The annotated tag `v0.9.9` dereferences to
209
+ `feee5c5854cd598af7b7827c53ddffdec3199573` on `main`, with CI and CodeQL green on
210
+ that commit. The DSH compatibility declaration did not change (the same five
211
+ audited hosts). The first CI run on the release commit failed in the helper job:
212
+ `govulncheck` reported GO-2026-6809 in Go 1.26.9's `crypto/x509`, reachable
213
+ through `http.Server.Serve`; the helper moved to Go 1.26.10 and the
214
+ `build-helpers` workflow refreshed all six binaries (PR #30, six `go1.26.10`
215
+ binaries, `bin/SHA256SUMS` 6/6) before the tag was cut. `publish.yml` ran on the
216
+ tag (run `39612245054`): the upload and provenance steps succeeded, but its last
217
+ step (registry verification) exhausted its 24 retries with `HTTP 404` — the
218
+ registry-visibility delay already seen in 0.9.5 and 0.9.6, not an upload failure.
219
+ Checked by hand instead: `npm view --prefer-online` gives `latest: 0.9.9` with a
220
+ `https://slsa.dev/provenance/v1` attestation whose `gitCommit` is that commit and
221
+ whose workflow ref is `refs/tags/v0.9.9`; the published tarball's SHA1
222
+ `bfea9ade6be9eb07f209e0e76f5ea20326dc0ddb` and its SHA512 match the registry and
223
+ the attestation subject; it holds 68 entries (the pre-publication pack count) and
224
+ every packaged file compared byte-identically with the verified tree. A clean
225
+ isolated `DSH_HOME` then installed `dsh-deeppilot@0.9.9` from npm on a real
226
+ `0.2.1-rc.2` host (`dsh web --no-open --port 0`) and `/phone/health` answered `200`
227
+ with `serverVersion: "0.9.9"`, `protocolVersion: 2` and the data plane active.
228
+ The first start attempt failed because DSH's own web server could not bind
229
+ `127.0.0.1:3080`, which another running DSH instance held; that is an environment
230
+ conflict, not a plugin fault, and the plugin's own listener had come up. The
231
+ GitHub Release was made public only after that install verification. The release
232
+ ships connection-failure diagnostics, the `failed` Live Activity phase, the
233
+ optional `toolName` / `detail` approval fields and `mutable-content`; it must run
234
+ against a Relay that already accepts them.
96
235
 
97
236
  ### Previous decision — `dsh-v0.2.1-alpha.5`
98
237
 
@@ -1756,7 +1895,7 @@ release notes.
1756
1895
 
1757
1896
  ## 2026-10-15 — 移动端技能发现扩展
1758
1897
 
1759
- 新增可选的 `skills` 手机能力,使用官方 `sessionSkillCatalog.list({sessionId}, AbortSignal)` 服务,已对照本机 `0.2.0-rc.2` 和 `0.2.1-alpha.3` 发行声明。缺少服务只关闭该特性,晚挂载服务会重新探测,不缓存缺席。未修改宿主版本范围、鉴权、包版本或命令派发契约。手机只接收元数据,技能注册表和会话预设、工作目录变化触发目录失效。完整文档清单与四类差异表见《技能提示对接说明》。此源码改动尚未发布,真实主机与真机技能加载仍未验收。
1898
+ 新增可选的 `skills` 手机能力,使用官方 `sessionSkillCatalog.list({sessionId}, AbortSignal)` 服务,已对照本机 `0.2.0-rc.2` 和 `0.2.1-alpha.3` 发行声明。缺少服务只关闭该特性,晚挂载服务会重新探测,不缓存缺席。未修改宿主版本范围、鉴权、包版本或命令派发契约。手机只接收元数据,技能注册表和会话预设、工作目录变化触发目录失效。完整文档清单与四类差异表见《技能提示对接说明》。此源码改动随 0.9.8(2026-10-18)发布;主机侧集成已在本机隔离真实宿主上验收,真机技能加载仍未验收。
1760
1899
 
1761
1900
  ## 2026-10-16 — 移动端系统指令扩展
1762
1901
 
@@ -1770,4 +1909,4 @@ release notes.
1770
1909
  1. 安装与主机 API:本轮不改安装范围或依赖;读取沿用现有技能、命令和模型接口。工作区另有 alpha.4 兼容改动,命令对接已重新枚举该版 29 包、144 个接口,相关主机实现与 alpha.3 相同;不据此宣称真实业务验收。
1771
1910
  2. 手机协议:模型当前选择投影新增 `s2c.models.changed`,受 `sessions.read` 控制;原生权限执行可附加 `expectedDefinitionId`,重读目录核对来源,旧客户端字段缺省兼容。无新增周期轮询或第二层主机时间缓存。
1772
1911
  3. 客户端:内存五分钟、磁盘最长七天,重启旧目录先展示并校验,按配对身份/主机/会话隔离;当前模型、权限和执行结果不落盘。具体约定和格式重建见[移动端目录缓存](移动端目录缓存.md)。
1773
- 4. 验证:插件 577 项通过、1 项原有待办,类型检查、生成产物构建和使用本机固定版本的离线配置校验通过;两端缓存单元与模拟器证据见各自文档。未发布。
1912
+ 4. 验证:插件 577 项通过、1 项原有待办,类型检查、生成产物构建和使用本机固定版本的离线配置校验通过;两端缓存单元与模拟器证据见各自文档。随 0.9.8(2026-10-18)发布;真机与系统分享仍未验收。
@@ -105,6 +105,36 @@
105
105
  本轮还确认了一个易漏点:升版本号必须同步重录
106
106
  `tests/apply-baseline.snapshot.json`,否则 `npm test` 会失败——已写入
107
107
  `AGENTS.md` 的发布流程第 1 步。
108
+ 8. `0.9.8` 的实际发布结果(2026-10-18):附注标签 `v0.9.8` 指向
109
+ `f4551b61602e5e60b11565ae31ccba3257d3dc9e`,该提交的 CI 与 CodeQL 均为绿;
110
+ `publish.yml` 在该标签上运行(运行号 `39048037503`,24 个步骤全部成功),
111
+ 注册表 `latest` 为 `0.9.8`。逐项核验:来源证明类型为
112
+ `https://slsa.dev/provenance/v1`,其 `gitCommit` 正是该提交;压缩包 SHA1
113
+ `8288977711e04679d077b970f863e726631fc309` 与 SHA512 与注册表一致;注册表
114
+ 条目数 68、解包 130,945,335 字节与发布前的打包核对一致,包内逐个文件与已验证
115
+ 的工作树逐字节相同。随后在全新隔离 profile 中从 npm 安装
116
+ `dsh-deeppilot@0.9.8`,在真实 `0.2.1-rc.2` 宿主上完成组合与启动,插件自有端口
117
+ 3098 的 `/phone/health` 返回 200 且 `serverVersion` 为 `0.9.8`;GitHub Release
118
+ 在这一步通过后才公开并标记 Latest。
119
+
120
+ 9. `0.9.9` 的实际发布结果(2026-10-21):附注标签 `v0.9.9` 指向
121
+ `feee5c5854cd598af7b7827c53ddffdec3199573`,该提交的 CI 与 CodeQL 均为绿。发布
122
+ 提交的首次 CI 曾因 helper 的 `govulncheck` 报 GO-2026-6809(Go 1.26.9 的
123
+ `crypto/x509`,调用链可达)而失败,处理方式是 helper 升到 Go 1.26.10,由
124
+ `build-helpers` 工作流重建六个二进制并合并刷新 PR(#30),之后才打标签。
125
+ `publish.yml` 在该标签上运行(运行号 `39612245054`):**上传与来源证明步骤成功,
126
+ 但最后的核对步骤在 24 次重试后仍抛 `读取 npm 发布信息失败(HTTP 404)`,整次运行
127
+ 结论为失败**——与 `0.9.5`、`0.9.6` 同一形态,说明 `0.9.7` 放宽的约 7 分钟窗口并非
128
+ 总是足够,注册表元数据的可见性延迟仍会超出它。事后人工核验:
129
+ `npm view --prefer-online` 得到 `latest = 0.9.9`;来源证明类型为
130
+ `https://slsa.dev/provenance/v1`,`gitCommit` 正是该提交,工作流引用为
131
+ `refs/tags/v0.9.9`;压缩包 SHA1 `bfea9ade6be9eb07f209e0e76f5ea20326dc0ddb` 与 SHA512
132
+ 同注册表和来源证明主体一致,共 68 个条目,包内每个文件与已验证的工作树逐字节相同。
133
+ 随后在全新隔离 `DSH_HOME` 中从 npm 安装 `dsh-deeppilot@0.9.9`,在真实
134
+ `0.2.1-rc.2` 宿主上用 `dsh web --no-open --port 0` 启动,`/phone/health` 返回 200,
135
+ `serverVersion` 为 `0.9.9`;首次启动因另一个正在运行的 DSH 占用了宿主自己的 3080
136
+ 端口而失败,属环境冲突,不是插件问题。GitHub Release 在这一步通过后才公开并标记
137
+ Latest。是否再放宽核对窗口,留待下次发布前决定,本次未改工作流。
108
138
 
109
139
  ## 五、官方资料
110
140