dsh-deeppilot 0.9.13 → 0.9.14

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,29 +1,33 @@
1
1
  # Compatibility
2
2
 
3
- This branch targets exactly **eight DSH releases**: `0.2.0-rc.2`; the `alpha`
4
- channel releases `0.2.1-alpha.3`, `0.2.1-alpha.4`, `0.2.1-alpha.5`, and
5
- `0.2.2-alpha.2`; and the `next` channel releases `0.2.1-rc.2`, `0.2.1-rc.3`, and
6
- `0.2.1-rc.4`. The npm channels have
7
- moved since: `latest` now points at `0.2.1-rc.2`, promoted from `next`, `next`
8
- at `0.2.1-rc.4`, and `alpha` at `0.2.2-alpha.2`. All eight are
9
- named in both `engines.dsh` and `peerDependencies`; no other version is accepted.
10
- DSH evaluates that declaration before composing a profile — on every start, not
11
- only on install — so a newly published DSH release deactivates this plugin until
12
- the list is widened deliberately. That is the intended trade: a plugin that
13
- cannot run on an unaudited host fails visibly instead of misbehaving quietly.
14
- The decision and the reversal it represents are recorded in
15
- the maintainers' local decision record `docs/adr/0001-dsh-compatibility-policy.md`, with the supporting audit in
3
+ This branch accepts DSH hosts inside the rolling compatibility range
4
+ `>=0.2.1-rc.5 <0.3.0-0`. The lower bound is the newest audited `rc` release at
5
+ decision time — npm `latest` and `next` both point at `0.2.1-rc.5` — and every
6
+ later `0.2.x` release is admitted without a per-release source audit, including
7
+ the `alpha` channel release `0.2.2-alpha.2` and later alphas, later rc releases,
8
+ and `0.2.x` GA. `0.3.0` and its prereleases stay refused until a fresh audit.
9
+ The bound is written `<0.3.0-0` because DSH evaluates the range with
10
+ `semver.satisfies(..., { includePrerelease: true })`, where `<0.3.0` would admit
11
+ `0.3.0-rc.1`. The range is named in both `engines.dsh` and `peerDependencies`; a
12
+ host outside it is refused. DSH evaluates that declaration before composing a
13
+ profile — on every start, not only on install.
14
+
15
+ This is a deliberate policy trade: a new DSH release inside the range activates
16
+ without waiting for a per-release audit, so a breaking change inside `0.2.x`
17
+ would surface at runtime instead of at the activation gate. The gate that
18
+ remains is the `0.3.0` boundary. The decision, its predecessor policies, and the
19
+ reversals are recorded in the maintainers' local decision record
20
+ `docs/adr/0001-dsh-compatibility-policy.md`, with the supporting audits in
16
21
  [`docs/DSH_RELEASE_MEMORY.md`](./docs/DSH_RELEASE_MEMORY.md).
17
22
 
18
- The development packages this branch builds and typechecks against stay pinned
19
- to the exact release-candidate baseline, currently `0.2.0-rc.2`; the audited
20
- `alpha` and `rc` hosts are covered by the isolated composes and live runs
21
- recorded in the release memory.
23
+ The development packages this branch builds and typechecks against are pinned to
24
+ the lower bound, currently `0.2.1-rc.5`; the audited host lines above it are
25
+ covered by the isolated composes and live runs recorded in the release memory.
22
26
 
23
27
  | Component | Current contract | Evidence |
24
28
  |---|---|---|
25
29
  | Node.js | 22 or newer | Package engine and CI |
26
- | 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 \|\| 0.2.1-rc.4 \|\| 0.2.2-alpha.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, a pre-widening 0.2.1-rc.2 host run where the unchanged declaration is refused at compose time, an isolated 0.2.1-rc.3 host where the widened declaration composes, starts, and answers `/phone/health` with 200, and isolated 0.2.1-rc.4 and 0.2.2-alpha.2 hosts where the eight-release declaration does the same (audits below) |
30
+ | DSH CLI and Host API | `engines.dsh` and `peerDependencies` both name the rolling range `>=0.2.1-rc.5 <0.3.0-0` (dev pins `0.2.1-rc.5`) | Peer metadata, source typecheck, unit tests, bundle build, and config schema projection against a real 0.2.1-rc.5 CLI, plus isolated composes and live phone-protocol runs across the audited hosts recorded below (0.2.1-alpha.2 through 0.2.2-alpha.2), a full-tree audit of 0.2.1-rc.5 against 0.2.1-rc.4, and an isolated rc.5 host that composes, starts, and answers `/phone/health` with 200 (`0.2.1-rc.5 audit outcome` below) |
27
31
  | DSH history read | `SessionController.inspect` when the host has it, `SessionController.page` otherwise | DSH 0.2.2-alpha.2 removed `inspect`; the adapter branches on its presence and maps the host page's `{type:'event',event}` records onto the bridge's `{event}` contract, expressing the phone's exclusive `beforeSeq` as the inclusive `throughSeq` cut. Unit tests cover both branches (audits below) |
28
32
  | iOS bridge | DeepPilot protocol v2 | Bridge protocol tests; device behavior must be checked with the running Host and app |
29
33
  | Remote access | Tailscale Funnel on ports 443, 8443, or 10000 | Helper and supervisor tests |
@@ -43,6 +47,7 @@ recorded in the release memory.
43
47
  - The current app accepts the `deeppilot://pair` link and the JSON pairing payload. Bearer authentication, URL credentials, and first-frame shared tokens are rejected; devices register a P-256 public key and sign each WebSocket challenge.
44
48
  - The plugin's persisted device and Funnel state migration remains separate from DSH API version support. Session logs written by earlier DSH builds are readable only when the current Host's own history reader accepts them; this plugin does not rewrite those logs.
45
49
  - An unavailable optional OS facility, transport, or controller disables its dependent capability without crashing the Host.
50
+ - Binary frames (`welcome.capabilities.binaryFrames`) are a plugin-level option between this plugin and the phone and do not depend on the DSH Host. The phone opts in per request with `binary: true`; older apps never do and keep receiving base64 text frames byte-for-byte as before, and older plugins ignore the field. The Funnel helper is a standard reverse proxy and passes binary WebSocket frames through unchanged.
46
51
 
47
52
  ## Schedules ship with the Web composition
48
53
 
@@ -67,7 +72,23 @@ built. The bridge mounts on `sessionController` / `connection` /
67
72
  `typertGateway`, all of which become ready before the Schedule service finishes
68
73
  its own initialization, so a probe taken at that moment would report `false` for
69
74
  the bridge's whole lifetime. On a live host with the service mounted the bit is
70
- `true` and the schedule list/create/history/delete flow passes.
75
+ `true` and the schedule list/create/history/delete flow passes on audited hosts
76
+ up to `0.2.2-alpha.2`.
77
+
78
+ **Known limitation on `0.2.2-alpha.3`.** That release moved automation to
79
+ host-level task management and rewrote the `dsh-schedule` service: `update` and
80
+ `delete` no longer exist (`edit({ action })` replaces them), `list` returns a
81
+ page object instead of an array, `create` takes its request first, and the
82
+ request body carries `timing` / `target` instead of the selector fields. The
83
+ bridge now serves both contracts from one adapter chosen by service shape, not
84
+ by version string: the legacy per-session path is unchanged, and the host-level
85
+ path adds the optional `schedulesHost` capability with host-level frames
86
+ (list / view / create / edit / run / limits) while projecting the legacy frames
87
+ onto host-level tasks, so an older App keeps schedule list, create, edit and
88
+ delete on that host. The wire contract is documented under
89
+ [`PROTOCOL.md`](./PROTOCOL.md) "Schedule 宿主级任务扩展". The audit and the
90
+ decision are recorded in
91
+ [`docs/DSH_RELEASE_MEMORY.md`](./docs/DSH_RELEASE_MEMORY.md).
71
92
 
72
93
  ## Configuration migration
73
94
 
@@ -77,6 +98,79 @@ carries the old top-level `debug: true` is accepted but that value is ignored:
77
98
  verbose logging must be turned on again from the settings page. No other config
78
99
  field changed shape, and the old key is not read anywhere in this version.
79
100
 
101
+ ## 0.2.2-rc.1 audit outcome
102
+
103
+ - **Same code as `0.2.2-alpha.3`.** 330 shared packages, zero structural
104
+ manifest changes, and only four non-manifest files differ (a build-commit
105
+ constant and three client bundles' version strings). The evaluator is
106
+ byte-identical, so the alpha.3 findings, including the host-level schedule
107
+ adapter, apply unchanged.
108
+ - **Vendor peers.** The host vendors `cordis 4.1.0` and `schemastery 3.19.0`,
109
+ the alpha.3 code renumbered as releases. The ranges append `~4.1.0` and
110
+ `~3.19.0`; earlier clauses stay because earlier hosts still vendor them. DSH's
111
+ evaluator ignores both peers; only npm's install-time resolution reads them.
112
+ - **Activation and boot.** The real rc.1 evaluator admits `0.9.14` and refuses
113
+ the published `0.9.13`. An isolated rc.1 host composes and starts the plugin,
114
+ and `/phone/health` answers 200 with `protocolVersion` 2.
115
+
116
+ ## 0.2.1-rc.5 audit outcome
117
+
118
+ The artifact-level audit of `dsh-v0.2.1-rc.5` (published to the npm registry
119
+ 2026-10-29T14:15:23Z; GitHub Release 2026-10-30T02:12:26Z, whose notes mention
120
+ only improved thinking-content display) against `dsh-v0.2.1-rc.4` found **no
121
+ runtime break**. The tree stays at 307 packages.
122
+
123
+ - **Whole-tree comparison.** 42,731 shared files: 42,421 byte-identical and 310
124
+ differing — 296 `package.json` files plus 14 non-manifest files in 7 packages;
125
+ one further file is new in rc.5 only
126
+ (`dsh-client-ui-chat/lib/types/client/reasoning-text.d.ts`, 363 B). `cordis`
127
+ and `schemastery` are byte-identical including their manifests, and the rc.4
128
+ tree fingerprint reproduced the previous audit's value, so both rounds compared
129
+ the same baseline.
130
+ - **No contract change.** All 307 manifests have zero `structural` changes (the
131
+ comparison covers the full 11,099-leaf union); the 3,706 dependency-spec
132
+ changes are mechanical `0.2.1-rc.4 → 0.2.1-rc.5` replacements. The evaluator
133
+ `dsh-app-boot/lib/index.js` is byte-identical to rc.4 (sha256 `5135179a…`), so
134
+ the activation gate behaves exactly as before.
135
+ - **The 15 non-manifest files (14 changed, 1 added) are outside this plugin's
136
+ surface.** `dsh-client-ui-chat` reworks the host's internal
137
+ `conversation.chat.reasoning.body` Slot (owner props gain `rawText`, and
138
+ reasoning text is stripped of its `<signature>` wrapper before display) plus
139
+ its types and three READMEs; `dsh-cordis-client-runner` updates the embedded
140
+ Slot registry metadata; `dsh-experimental-client-ui-cot-translation` changes
141
+ only JSDoc/type comments; `dsh-client-modules` changes a build-commit
142
+ constant; three settings/sidebar client bundles change only version strings
143
+ (same byte size). None of these packages is in the declaration surface (10
144
+ peers, 4 client injects, vendored cordis/schemastery) or the plugin call
145
+ surface, and a machine check over the 7 packages reports
146
+ `allOutsideDeclarationSurface`.
147
+ - **Patch anchor unchanged.** `dsh-web-app/cordis.patch.yml` is byte-identical to
148
+ rc.4 (same 595 lines / 117 entries / sha256 `cdceb423…`), so the
149
+ `id: directory-picker` block this plugin disables is untouched.
150
+ - **Export and client faces unchanged.** All 3,271 `lib/` modules and 681 entry
151
+ modules have identical export surfaces; the four client-injected packages are
152
+ byte-identical.
153
+ - **Activation matrix.** The previous closed list rejected `0.2.1-rc.5`; the
154
+ rolling range admits it together with `0.2.2-alpha.2`, `0.2.1`, later rc and
155
+ alpha releases and `0.2.x` GA. Twelve candidates are newly admitted and
156
+ exactly the seven former list members are newly refused; `0.3.0-rc.1`,
157
+ `0.3.0`, `0.3.0-0`, and `1.0.0` stay refused. Every verdict matched an
158
+ independent semver calculation. The range also admits unaudited
159
+ `0.2.2`/`0.2.3` prereleases by construction (`0.2.2-alpha.1`,
160
+ `0.2.2-alpha.2.1`, `0.2.2-ALPHA.2`, `0.2.2-0`); this is the accepted cost of a
161
+ rolling range, not an evaluator quirk.
162
+ - **Live load.** In an isolated `DSH_HOME` the rc.5 host composes the plugin
163
+ (`--dump-config` exit 0, no skip line), starts it, and the plugin's own LAN
164
+ listener answers `/phone/health` with 200; the isolated home receives
165
+ `deeppilot/host-id` and `deeppilot/lan-tls/`.
166
+ - **Vendor peers.** rc.5 still vendors `cordis 4.0.5` and `schemastery 3.18.5`,
167
+ both already inside the declared ranges, so no vendor clause changed.
168
+ - **Known boundary.** `dsh-client-ui-slots` has no artifact in either tree (same
169
+ as the rc.4 round), so it was not byte-compared; `react` was not compared; the
170
+ npm install-time resolution was not run.
171
+ - **Evidence.** `.rc5-verify/AUDIT.md`, `.rc5-verify/HOST-BOOT.md`, and the JSON
172
+ logs beside them.
173
+
80
174
  ## 0.2.2-alpha.2 audit outcome
81
175
 
82
176
  The artifact-level audit of `dsh-v0.2.2-alpha.2` (published to the npm registry
package/README.md CHANGED
@@ -39,25 +39,24 @@ Host on your own computer and does not replace or modify the DSH Web UI.
39
39
 
40
40
  ## Install from npm
41
41
 
42
- This source checkout targets Node.js 22+ and the eight DSH releases it has been
43
- audited against — `0.2.0-rc.2`, the `alpha` channel releases `0.2.1-alpha.3`,
44
- `0.2.1-alpha.4`, `0.2.1-alpha.5`, and `0.2.2-alpha.2`, and the `next` channel
45
- releases it has admitted in turn, `0.2.1-rc.2`, `0.2.1-rc.3`, and `0.2.1-rc.4` —
46
- with a `web` profile. (The npm channels move: `latest` now points at
47
- `0.2.1-rc.2`, which was promoted from `next`, `next` at `0.2.1-rc.4`, and
48
- `alpha` at `0.2.2-alpha.2`.) DSH checks a plugin's declared
49
- requirements before composing a profile, on every start rather than only on
50
- install, so any other host version refuses to activate this plugin. From DSH
51
- `0.2.1-alpha.4` on, that check reads `engines.dsh` and ignores
52
- `peerDependencies`; older hosts know only the peer range, so both name the same
53
- eight releases. The package includes Funnel helpers
54
- for macOS, Linux, and Windows on amd64/arm64; trusted-LAN mode does not require
55
- the helper. The helper is built with Go 1.27, which requires **macOS 13 Ventura
56
- or later**: on macOS 12 and earlier, Funnel mode cannot start, while
57
- trusted-LAN mode keeps working.
58
-
59
- The current working tree names exactly those six versions in `engines.dsh` and
60
- `peerDependencies` and is built/typechecked against `0.2.0-rc.2`. A previously
42
+ This source checkout targets Node.js 22+ and DSH hosts inside the rolling
43
+ compatibility range `>=0.2.1-rc.5 <0.3.0-0` with a `web` profile. The lower
44
+ bound is the newest audited `rc` release at decision time — npm `latest` and
45
+ `next` both point at `0.2.1-rc.5` — and every later `0.2.x` release is admitted
46
+ automatically, including the `alpha` channel release `0.2.2-alpha.2` and later
47
+ alphas, later rc releases, and `0.2.x` GA. `0.3.0` and its prereleases stay
48
+ refused until a fresh audit. DSH checks a plugin's declared requirements before
49
+ composing a profile, on every start rather than only on install, so a host
50
+ outside the range refuses to activate this plugin. From DSH `0.2.1-alpha.4` on,
51
+ that check reads `engines.dsh` and ignores `peerDependencies`; older hosts know
52
+ only the peer range, so both declare the identical range. The package includes
53
+ Funnel helpers for macOS, Linux, and Windows on amd64/arm64; trusted-LAN mode
54
+ does not require the helper. The helper is built with Go 1.27, which requires
55
+ **macOS 13 Ventura or later**: on macOS 12 and earlier, Funnel mode cannot
56
+ start, while trusted-LAN mode keeps working.
57
+
58
+ The current working tree declares that range in `engines.dsh` and
59
+ `peerDependencies` and is built/typechecked against `0.2.1-rc.5`. A previously
61
60
  published plugin package may still carry its own older compatibility
62
61
  declaration until a release is made from this tree.
63
62
 
package/README.zh-CN.md CHANGED
@@ -34,22 +34,22 @@
34
34
 
35
35
  ## 从 npm 安装
36
36
 
37
- 当前源码面向 Node.js 22+ 与带 `web` profile 的**八个已审计 DSH 版本**:
38
- `0.2.0-rc.2`、`alpha` 通道的 `0.2.1-alpha.3`、
39
- `0.2.1-alpha.4`、`0.2.1-alpha.5` 与 `0.2.2-alpha.2`,以及先后三版 `next` 通道的
40
- `0.2.1-rc.2`、`0.2.1-rc.3` 与 `0.2.1-rc.4`(npm 通道会移动:`latest` 现指向由 `next` 转正的
41
- `0.2.1-rc.2`,`next` 指向 `0.2.1-rc.4`,`alpha` 指向 `0.2.2-alpha.2`)。
42
- DSH 在组合 profile 前会校验插件声明的
43
- 兼容要求,且**每次启动都会校验**(不只是安装时),因此其他宿主版本会拒绝
44
- 激活本插件。从 DSH `0.2.1-alpha.4` 起,该校验只读 `engines.dsh` 并忽略
45
- `peerDependencies`;更早的宿主只认 peer 范围,因此两处列出同一组八个版本。
46
- npm 包内置 macOS、Linux、Windows 的 amd64/arm64 Funnel helper;可信局域网
47
- 模式不依赖 helper。helper 用 Go 1.27 编译,要求 **macOS 13 Ventura 或更高版本**:
48
- macOS 12 及更早版本无法启动 Funnel 模式,可信局域网模式不受影响。
49
-
50
- 当前工作树的 `engines.dsh` 与 `peerDependencies` 精确列出这六个版本,构建与
51
- 类型检查针对 `0.2.0-rc.2`。从此工作树发布新版本前,已发布的旧插件包仍可能
52
- 带有各自旧的兼容声明。
37
+ 当前源码面向 Node.js 22+ 与**滚动兼容区间** `>=0.2.1-rc.5 <0.3.0-0` 内的
38
+ DSH 宿主(带 `web` profile)。下界是决策时最新的已审计 `rc` 版本(npm
39
+ `latest` 与 `next` 均指向 `0.2.1-rc.5`);其后的所有 `0.2.x` 版本自动放行,
40
+ 包括 `alpha` 通道的 `0.2.2-alpha.2` 及之后的 alpha、之后的 rc 与 `0.2.x`
41
+ 正式版。`0.3.0` 及其预发布仍需重新审计,由上界 `<0.3.0-0` 拦下。
42
+ DSH 在组合 profile 前会校验插件声明的兼容要求,且**每次启动都会校验**(不只是
43
+ 安装时),因此区间外的宿主会拒绝激活本插件。从 DSH `0.2.1-alpha.4` 起,该校验
44
+ 只读 `engines.dsh` 并忽略 `peerDependencies`;更早的宿主只认 peer 范围,因此
45
+ 两处声明同一区间。npm 包内置 macOS、Linux、Windows 的 amd64/arm64 Funnel
46
+ helper;可信局域网模式不依赖 helper。helper 用 Go 1.27 编译,要求 **macOS 13
47
+ Ventura 或更高版本**:macOS 12 及更早版本无法启动 Funnel 模式,可信局域网模式
48
+ 不受影响。
49
+
50
+ 当前工作树的 `engines.dsh` 与 `peerDependencies` 声明该区间,构建与类型检查
51
+ 针对 `0.2.1-rc.5`。从此工作树发布新版本前,已发布的旧插件包仍可能带有各自旧的
52
+ 兼容声明。
53
53
 
54
54
  ```sh
55
55
  dsh plugin --profile web add dsh-deeppilot
package/bin/SHA256SUMS CHANGED
@@ -1,6 +1,6 @@
1
- cc7f9ae55c7a8b717a45cd83fd671e2c9b6993f91c09f33c44fd28ea459eeba0 ./darwin-amd64/dsh-deeppilot-tunnel
2
- 37f7430994f6ad79a2a93573f79ea2a1b1a6108fac054117548d8268dca422db ./darwin-arm64/dsh-deeppilot-tunnel
3
- 051ff06069db0f4ede5570a693811f380cf0740065df3969113b0b5d9ded3c0f ./linux-amd64/dsh-deeppilot-tunnel
4
- f704a48365d952185e6b6c28d655db0e174cbf1b9557e3fe40493ca1f7c614fe ./linux-arm64/dsh-deeppilot-tunnel
5
- ac2470db2843958af431de284212018ff8f2f9aa147a08359aada21e3a5a09b1 ./windows-amd64/dsh-deeppilot-tunnel.exe
6
- 541da90383098daecda68f910058d8071439d07f2edd7726f0af6fdb3c778b7d ./windows-arm64/dsh-deeppilot-tunnel.exe
1
+ c79c889415f6fce13a2d0f19c94e2ceb5cbfc06ec5c841c1002092783663a6a6 ./darwin-amd64/dsh-deeppilot-tunnel
2
+ affe9151e5356b574e1a85c806b198c39b5804f3a305b655cd3eb03c628ae0cc ./darwin-arm64/dsh-deeppilot-tunnel
3
+ a2475a2844250a6ef03853fe64db63eb1a163d9fcd7f3f438f3ec7a142d3a044 ./linux-amd64/dsh-deeppilot-tunnel
4
+ 6241de8d3c67e6e2af98e6b6040a10d9352183f893d3aed82c879a76c8b79432 ./linux-arm64/dsh-deeppilot-tunnel
5
+ 9449d3c48cc11446cd0f35c030f28000b5934512512fc1d7eeaa769d8d8304f3 ./windows-amd64/dsh-deeppilot-tunnel.exe
6
+ fd0c912b5b39ba8bd385cb05c39665d89519c75b6f5ddbc506b7554926f6545f ./windows-arm64/dsh-deeppilot-tunnel.exe
@@ -17,6 +17,8 @@
17
17
  | `pluginManager.listVersions` / `registries` | 公开版本目录及软件源配置 | 已读 | 显示候选版本,读取精确协议声明,确定实际候选源 |
18
18
  | `pluginManager.updateBundle` / `listBundles` | 精确版本更新、实际安装清单 | 已读 | 由宿主完成 HMR 替换和失败回滚,再核对安装与运行版本 |
19
19
  | `plugin-manager/registry.registryPlan` | 公开软件源选择规则 | 已读并建立对照测试 | 预检宿主可能回退到的全部来源,禁止不同协议或完整性摘要绕过闸门 |
20
+ | `locale/<lang>.json` 的 `meta.detail` | 插件管理页按语言链读取详情文档,缺省退回包根 README | 已读 `dsh-plugin-detail` 选择规则 | 英文 `README.md`、中文 `README.zh-CN.md` |
21
+ | `settings.section.icon` 插槽 | 设置壳按 `settings.section` 同 id 渲染,`{size, active}` | 已读壳渲染与插槽声明 | 导航行显示单色线性手机图标;旧宿主不声明该插槽,保留默认图标 |
20
22
  | npm 精确版本 manifest | GET `{registry}/dsh-deeppilot/{version}` | 已读并限制响应大小及超时 | 核对包名、精确版本、bundle、`deepPilot.protocolVersion` 与强 SRI |
21
23
  | 其他新模块 | 新增包及发布清单 | 仅盘点 | 未接入,不引入额外产品行为 |
22
24
 
@@ -24,8 +26,8 @@
24
26
 
25
27
  | 类别 | 本轮范围内的状态 |
26
28
  |---|---|
27
- | 双方都有 | ZIP/Markdown 导出、瞬时流生命周期与正式事件关联、明确确认的更新及状态查询、兼容性闸门、宿主 HMR/回滚、断线后日志对账 |
28
- | 上游有、我方未接 | 自动化任务批量清理、Web 引用交互、插件富文本详情及其他 Web 专属入口;本轮未扩展手机对应功能 |
29
+ | 双方都有 | ZIP/Markdown 导出、瞬时流生命周期与正式事件关联、明确确认的更新及状态查询、兼容性闸门、宿主 HMR/回滚、断线后日志对账、插件详情页多语言文档、设置导航图标 |
30
+ | 上游有、我方未接 | Web 引用交互及其他 Web 专属入口(自动化任务批量清理已由下文 `deleteEnded` 接入);本轮未扩展手机对应功能 |
29
31
  | 我方有、上游没有 | 手机专用分块传输、独立瞬时 wire 帧、设备隔离的持久更新日志、App 协议版本闸门 |
30
32
  | 双方都没有 | 不支持的宿主上强制重启进程、手机静默安装、替用户发布 npm/GitHub 版本 |
31
33
 
@@ -38,6 +40,39 @@
38
40
  - 更新接受回执在目标校验和日志耐久写入后发送。最近结果保留供重连对账;同请求编号不能更换目标,也不能重复安装。日志不保存凭据或会话内容,设备归属仅保存摘要并只向所属设备返回。
39
41
  - “恢复”指 HMR 后重连并恢复当前会话。宿主无 HMR 时返回 `restart-required`;不会强杀宿主,不能声称已经自动重启。安装失败由宿主恢复旧版本,桥接只核验并呈现结果。
40
42
 
43
+ ## 宿主级计划任务(DSH 0.2.2-alpha.3)
44
+
45
+ `0.2.2-alpha.3` 把自动化任务改为宿主级模型(任务带 `target`,状态有
46
+ `active` / `paused` / `ended`),并重写了 `dsh-schedule` 服务面。插件按**服务形状**
47
+ (有 `edit`、无 `update`)选择适配器,不看版本号字符串;旧宿主逐字节保持原行为。
48
+ wire 契约见 [PROTOCOL.md](../PROTOCOL.md) 「Schedule 宿主级任务扩展」。
49
+
50
+ | 上游接口 | 本次阅读 | 桥接用途 |
51
+ |---|---|---|
52
+ | `schedule.list({active?,limit?,offset?})` | 分页对象 `{items,shown,total,limit,offset}` | 新帧 `c2s.schedule.host.list`;旧帧全量分页后过滤目标会话 |
53
+ | `schedule.view({id})` | 任务或 miss | `c2s.schedule.host.view` |
54
+ | `schedule.create(request, actorSessionId?, signal)` | `timing` + `target` 请求体 | `c2s.schedule.host.create`;旧帧把选择器转 `timing` + `target:{kind:"session"}` |
55
+ | `schedule.edit({id, action, patch?, expectedUpdatedAt?}, …)` | update/delete 合一 | `c2s.schedule.host.edit`;旧帧 update 用 `expected` 逐字段比较后转 `patch` |
56
+ | `schedule.run({id})` | 手动执行,执行中返回 `schedule_execution_pending` | `c2s.schedule.host.run`(E_BUSY 提示稍后) |
57
+ | `schedule.history({id,limit,before?})` | 与旧结构相同,不再校验会话归属 | 两种模型共用 `c2s.schedule.history`;宿主级忽略 `sessionId` |
58
+ | `schedule.deliveryLimits()` | `{newSessionIntervalSeconds}` | `c2s.schedule.host.limits` 只做展示,不自行节流 |
59
+ | `schedule.deleteInactive()` | `{deleted}`;alpha.3 删 `status="ended"`(alpha.2 判 `inactive`) | `c2s.schedule.host.deleteEnded`,回执 `deletedEnded`;手机端二次确认后才发 |
60
+ | 旧 `delete` / `update` / 按会话的 `list` | 仅在会话级宿主存在 | 旧帧原路径;宿主级宿主上由适配层映射 |
61
+
62
+ 差异对照补充:
63
+
64
+ | 类别 | 状态 |
65
+ |---|---|
66
+ | 双方都有 | 列表、创建、编辑、删除、清理已结束任务、投递历史、变更事件 |
67
+ | 上游有、我方未接 | `catalog`(不分页全量)——手机会话内入口改用分页列表连续翻页取全量,不需要单独的帧 |
68
+ | 我方有、上游没有 | 旧 App 的会话级视图(由宿主级任务反向投影)、按会话过滤的列表 |
69
+ | 双方都没有 | 任务执行结果回执、跨设备编辑锁(只用 `expectedUpdatedAt` 乐观冲突) |
70
+
71
+ 边界:旧视图过滤 `target.kind="session"` 且同会话、丢弃 `ended`、跳过 `rrule`(旧枚举无
72
+ 对应 kind,避免旧 App 整页解码失败);旧 `update` 的冲突保护是「`expected` 与当前任务
73
+ 逐字段比较」的尽力而为,旧视图没有 `updatedAt`;新帧用 `expectedUpdatedAt` 做真正的
74
+ 乐观冲突检测。`run` 按 `clientRequestId` 幂等,结果未知时客户端不得自动重试。
75
+
41
76
  ## 验证入口
42
77
 
43
- 插件用例:`tests/markdown-export.test.ts`、`tests/assistant-stream.test.ts`、`tests/plugin-update.test.ts`,以及 wire 注册表、历史适配和命令回归。iOS 测试及实机边界见私有项目的对接说明。真机、实际 npm 安装和 Funnel 验证不得由模拟或语法检查替代。
78
+ 插件用例:`tests/markdown-export.test.ts`、`tests/assistant-stream.test.ts`、`tests/plugin-update.test.ts`、`tests/schedule.test.ts`(双形态适配与七个新帧),以及 wire 注册表、历史适配和命令回归。iOS 测试及实机边界见私有项目的对接说明。真机、实际 npm 安装和 Funnel 验证不得由模拟或语法检查替代。
@@ -1,7 +1,153 @@
1
1
  # DSH release compatibility memory
2
2
 
3
- > This is the durable audit record for DeepPilot's public DSH plugin. Re-audit
4
- > the next DSH release instead of assuming that an rc upgrade is runtime-safe.
3
+ > This is the durable audit record for DeepPilot's public DSH plugin. Since
4
+ > 2026-10-30 the declaration is a rolling range: audit a release when it would
5
+ > move the lower bound, at each `0.x` minor boundary, or when a host inside the
6
+ > range breaks at runtime.
7
+
8
+ ## Audit record — `dsh-v0.2.2-rc.1` (rebuild of alpha.3, no runtime change)
9
+
10
+ - **Release (2026-11-04):** `dsh-v0.2.2-rc.1`, now npm `next`; `latest` stays
11
+ `0.2.1-rc.5`, `alpha` stays `0.2.2-alpha.3`. Inside the rolling range, so **no
12
+ declaration change**. The release notes summarize everything since
13
+ `0.2.1-rc.5`, so most listed items already shipped in `0.2.2-alpha.2/3`.
14
+ - **Tree vs `0.2.2-alpha.3`:** 330 shared packages, zero manifest structural
15
+ changes after normalizing version strings, and only four non-manifest files
16
+ differ (`dsh-client-modules` build commit, three client bundles' version
17
+ strings). `cordis 4.0.6-alpha.2 → 4.1.0` and `schemastery 3.18.6-alpha.2 →
18
+ 3.19.0` change only `package.json` (version and `cosmokit`/`cordis-plugin-*`
19
+ ranges); code is byte-identical. The evaluator `dsh-app-boot/lib/index.js` is
20
+ byte-identical (sha256 `346f8322…`), so every alpha.3 finding — including the
21
+ schedule host-adapter requirement — carries over unchanged.
22
+ - **Gate (real rc.1 evaluator):** worktree `0.9.14` accepted on `0.2.2-rc.1`,
23
+ `0.2.2-alpha.3`, `0.2.1-rc.5`, `0.2.2`; refused on `0.3.0-rc.1`. Published
24
+ `0.9.13` (eight-release list) is refused on every one of them — `next`-channel
25
+ users need `0.9.14` published before the plugin activates.
26
+ - **Boot:** isolated `DSH_HOME` with the rc.1 CLI: `--dump-config` exit 0, empty
27
+ stderr, 7 `deeppilot` hits; `/phone/health` 200 (`protocolVersion` 2,
28
+ `serverVersion` 0.9.14, `dataPlane` active); `deeppilot/host-id` and
29
+ `lan-tls/` created.
30
+ - **Vendor peers (install-time only), decided 2026-11-05:** the previous
31
+ `@deepseek-ai/cordis` / `@deepseek-ai/schemastery` peers did not admit the
32
+ vendored `4.1.0` / `3.19.0`. Both are optional peers the evaluator ignores
33
+ (`engines.dsh` decides), so activation was never affected. `0.9.14` appends
34
+ `~4.1.0` / `~3.19.0` (append, not replace: earlier hosts still vendor the
35
+ older pairs); `tests/compatibility-metadata.test.ts` pins both.
36
+ - **Not covered:** no real-device pairing, Funnel end-to-end, model turn, or
37
+ `npm install` from the registry via the host's plugin manager.
38
+
39
+ ## Audit record — `dsh-v0.2.2-alpha.3` (runtime break inside the range)
40
+
41
+ - **Release (2026-11-03):** `dsh-v0.2.2-alpha.3` on the npm `alpha` channel
42
+ (published 2026-11-03T07:48:26Z); `latest` and `next` remain `0.2.1-rc.5`. It
43
+ is inside the rolling range, so **no declaration change** was needed. The real
44
+ `0.2.2-alpha.3` evaluator accepted the worktree `0.9.14` manifest with zero
45
+ requirements and refused the published `0.9.13` (eight-release list) with a
46
+ single `engines.dsh` requirement — alpha-channel users must upgrade the plugin
47
+ before it activates.
48
+ - **Gate and install surface:** 18 candidate versions were scored with the
49
+ published evaluator and an independent semver recomputation with zero
50
+ disagreements (`0.3.0-0`, `0.3.0-rc.1`, `0.3.0`, `1.0.0` stay refused). The
51
+ host vendors `cordis 4.0.6-alpha.2` / `schemastery 3.18.6-alpha.2`, both
52
+ inside this plugin's peer ranges; its `engines.node` is `>=24.9.0`.
53
+ - **One runtime break, confined to schedule.** `0.2.2-alpha.3` moved automation
54
+ to host-level task management and rewrote `dsh-schedule`: `update` and
55
+ `delete` are gone (`edit({ id, action: 'update' | 'delete', patch,
56
+ expectedUpdatedAt })` replaces them), `list` returns
57
+ `{ items, shown, total, limit, offset }` instead of an array, `create` takes
58
+ `(request, actorSessionId, signal)`, and the request body uses `timing` /
59
+ `target` instead of `at` / `after_seconds` / …. The four bridge call sites
60
+ (`src/dsh-api-proxy.ts:216/232/236/248`) still speak the `0.2.2-alpha.2`
61
+ contract, so the phone's schedule list, create, edit and delete fail while
62
+ `schedule.history` keeps working. The `schedules` capability bit stays `true`
63
+ because it probes service presence only, so the break is silent (each action
64
+ returns an internal error) instead of hiding the feature. No other contract
65
+ changed: 24 of the 25 audited interfaces are identical or compatibly changed
66
+ and the client face is untouched.
67
+ - **Runtime verification:** an isolated `0.2.2-alpha.3` host composed and started
68
+ the `0.9.14` worktree (`--dump-config` exit 0, no skipped bundle, 199 composed
69
+ entries), `/phone/health` returned 200 with `protocolVersion` 2 and
70
+ `serverVersion` `0.9.14`, and the live 3080 host on the same build serves the
71
+ same plugin from its linked worktree. The config schema projection accepts
72
+ every `deeppilot` option, and `NODE_DEBUG=esm` proves the plugin's
73
+ `@deepseek-ai/*` imports resolve to the alpha.3 installation tree rather than
74
+ the pinned dev copies.
75
+ - **Decision:** keep the rolling range; ship `0.9.14` so alpha-channel users get
76
+ a host-activatable plugin. The schedule adapter now serves both contracts
77
+ (shape-detected `legacy` / `host` adapters, additive protocol v2 capability
78
+ `schedulesHost`, host-level frames, legacy frames projected onto host-level
79
+ tasks, iOS mirror); the wire contract lives in `PROTOCOL.md` section "Schedule
80
+ 宿主级任务扩展". The public contract consequence is recorded in
81
+ `COMPATIBILITY.md`.
82
+ - **Evidence:** `.alpha3-verify/AUDIT.md`, `CHANGE_SURFACE.md`, `CLIENT_FACE.md`,
83
+ `HOST-BOOT.md` and `logs/` in this repository; `.alpha3-verify/gate-matrix.mjs`
84
+ reproduces every activation verdict.
85
+
86
+ ## Current decision — rolling range from `dsh-v0.2.1-rc.5`
87
+
88
+ - **Decision (2026-10-30):** the compatibility declaration is one rolling range,
89
+ `>=0.2.1-rc.5 <0.3.0-0`, in `engines.dsh` and all ten `@deepseek-ai/dsh*`
90
+ peers, replacing the eight-release closed list. The lower bound is the newest
91
+ `rc` release (`0.2.1-rc.5`, published 2026-10-29T14:15:23Z); the current
92
+ `alpha` release `0.2.2-alpha.2` sorts above it and needs no second clause.
93
+ `<0.3.0-0` keeps the `0.3.0` audit gate. Dev packages move to the exact
94
+ `0.2.1-rc.5` baseline with vendored `cordis 4.0.5` / `schemastery 3.18.5`.
95
+ Release `0.9.14`. Recorded in `docs/adr/0001-dsh-compatibility-policy.md`
96
+ section 8.
97
+ - **Trigger:** `latest` and `next` both moved to `0.2.1-rc.5`; the closed list
98
+ (ending `0.2.2-alpha.2`) refused to activate on it, and every DSH release
99
+ required eleven declaration edits plus a lockfile, test, and doc pass.
100
+ - **Audit of `dsh-v0.2.1-rc.5` against `dsh-v0.2.1-rc.4` (`.rc5-verify/`):**
101
+ **no runtime break, `src/` unchanged.** 307 = 307 packages; 42,731 shared
102
+ files: 42,421 byte-identical, 310 differing (296 `package.json` + 14
103
+ non-manifest files in 7 packages), plus one file new in rc.5 only
104
+ (`dsh-client-ui-chat/lib/types/client/reasoning-text.d.ts`, 363 B). The rc.4
105
+ tree fingerprint reproduced the previous audit's value. All 307 manifests have
106
+ zero structural changes across the full 11,099-leaf union; 3,706 dependency
107
+ specs are mechanical `0.2.1-rc.4 → 0.2.1-rc.5` replacements. The evaluator
108
+ `dsh-app-boot/lib/index.js` is byte-identical to rc.4 (sha256 `5135179a…`,
109
+ same as rc.3). `dsh-web-app/cordis.patch.yml` is byte-identical, so the
110
+ `id: directory-picker` patch anchor is untouched. The four client faces are
111
+ byte-identical. 3,271 `lib/` modules and 681 entry modules show zero export
112
+ deltas. The 15 non-manifest files (14 changed, 1 added) live in
113
+ `dsh-client-ui-chat` (the internal `conversation.chat.reasoning.body` Slot
114
+ gains `rawText`, reasoning text strips its `<signature>` wrapper before
115
+ display, plus types and READMEs), `dsh-cordis-client-runner` (embedded Slot
116
+ registry metadata), `dsh-experimental-client-ui-cot-translation` (JSDoc/type
117
+ comments only), `dsh-client-modules` (build-commit constant), and three
118
+ settings/sidebar client bundles (version strings, same byte size). A machine
119
+ check over the 7 packages reports `allOutsideDeclarationSurface`; none is in
120
+ the declaration surface (10 peers + 4 client injects + vendored
121
+ cordis/schemastery) or the plugin call surface.
122
+ - **Matrix (rc.5 evaluator, `includePrerelease: true`):** before → `0.2.1-rc.5`
123
+ rejected; after → `0.2.1-rc.5`, `0.2.2-alpha.2`, `0.2.1`, later rc/alpha/GA
124
+ admitted — 12 candidates newly admitted, exactly the seven former list members
125
+ newly refused — while `0.3.0-rc.1`, `0.3.0`, `0.3.0-0`, and `1.0.0` stay
126
+ rejected. Every verdict matched an independent semver calculation, and dropping
127
+ `engines.dsh` to exercise the peer path yields the same accepted set. The range
128
+ also admits unaudited prereleases above the bound by construction
129
+ (`0.2.2-alpha.1`, `0.2.2-alpha.2.1`, `0.2.2-ALPHA.2`, `0.2.2-0`); this is
130
+ pinned as a known admission surface in `tests/compatibility-metadata.test.ts`.
131
+ - **Positive load (isolated `DSH_HOME`, `.rc5-verify/HOST-BOOT.md`):** with a
132
+ projected manifest carrying only the new range, the rc.5 host composes the
133
+ plugin (`--dump-config` exit 0, no `skipping profile bundle` line, 7
134
+ `deeppilot` hits), starts it, and the plugin's own LAN port answers
135
+ `/phone/health` with 200 (`ok`, `enabled`, `protocolVersion` 2, `dataPlane`
136
+ active). Both the committed 0.9.13 artifacts (`serverVersion` 0.9.13) and the
137
+ in-flight 0.9.14 worktree (`serverVersion` 0.9.14) load. The isolated home
138
+ received `deeppilot/host-id` and `deeppilot/lan-tls/`.
139
+ - **Verification:** `npm test` 681 (679 pass, 1 pre-existing todo, 1 skipped),
140
+ `typecheck`, `build`, `check:config-schema` against the `0.2.1-rc.5` CLI,
141
+ `smoke:helper`, `go test ./...`, `bin/SHA256SUMS` 6/6.
142
+ - **Evidence:** `.rc5-verify/AUDIT.md`, `CHANGE_SURFACE.md`, `HOST-BOOT.md`,
143
+ `tree-compare.out.json`, `matrix.out.json`, `evaluator-repro.out.json`,
144
+ `patch-anchor-check.out.json`, `export-symbol-diff.out.json`,
145
+ `pkg-manifest-delta.out.json`, `vendor-check.out.json`, `diffs/`, `logs/`.
146
+ - **Honest boundary:** `dsh-client-ui-slots` has no artifact in either tree (as
147
+ in the rc.4 round), so it was not byte-compared; `react` and the npm
148
+ install-time resolution were not checked; no real-device pairing, Funnel
149
+ end-to-end, or model turn was run; `0.9.14` is prepared locally, not
150
+ published.
5
151
 
6
152
  ## Current decision — `dsh-v0.2.2-alpha.2`
7
153
 
@@ -2187,3 +2333,13 @@ release notes.
2187
2333
  2. 手机协议:模型当前选择投影新增 `s2c.models.changed`,受 `sessions.read` 控制;原生权限执行可附加 `expectedDefinitionId`,重读目录核对来源,旧客户端字段缺省兼容。无新增周期轮询或第二层主机时间缓存。
2188
2334
  3. 客户端:内存五分钟、磁盘最长七天,重启旧目录先展示并校验,按配对身份/主机/会话隔离;当前模型、权限和执行结果不落盘。具体约定和格式重建见[移动端目录缓存](移动端目录缓存.md)。
2189
2335
  4. 验证:插件 577 项通过、1 项原有待办,类型检查、生成产物构建和使用本机固定版本的离线配置校验通过;两端缓存单元与模拟器证据见各自文档。随 0.9.8(2026-10-18)发布;真机与系统分享仍未验收。
2336
+
2337
+ ## 2026-10-30 — 发布 `dsh-deeppilot@0.9.13`
2338
+
2339
+ - **版本收口。** `0.9.12` 的版本提交 `a5a6f59` 曾落在 `main`,但从未打 tag、上传 npm 或建 GitHub Release;本次在 `0.9.11` 之上统一收口为 `0.9.13`:八版白名单(新增 `0.2.1-rc.4` 与 `0.2.2-alpha.2`,`SessionController.inspect` 缺失时 `sessions.history` 走 `page`)、运行中排队与转向、Markdown 导出、实时流式增量、插件自更新、设置页重设计,以及 helper 上报内嵌 Tailscale 版本后的六平台 `bin/` 重建。
2340
+ - **安装面。** `engines.dsh` 与十条 `dsh-*` peer 枚举八个精确版本;vendor peer 追加 `cordis ~4.0.6-alpha.1` / `schemastery ~3.18.6-alpha.1`;无配置字段变化。审计与隔离宿主证据见 `.alpha2-verify/`、`.rc4-verify/`(`0.2.1-rc.4` 27/27、`0.2.2-alpha.2` 32/32)。
2341
+ - **本地校验(发布工作树)。** `npm ci`;`npm test` 679 项(677 通过、1 项环境门禁跳过、1 项有意 TODO、0 失败);`typecheck`;`build`(`lib/` 无变化);`check:config-schema`(0.2.0-rc.2 CLI);`smoke:helper`(darwin-arm64);`go test ./...`;`bin/SHA256SUMS` 6/6;六平台 helper 重建后 `bin/` 无漂移;`npm pack` 69 项、51,405,933 字节。
2342
+ - **发布。** 发布提交 `0107efb584be4031af7279eb9f6cdf4404189081`,附注标签 `v0.9.13`;CI `40910195877` 与 CodeQL `40910195831` 绿色。`publish.yml` 首次运行 `40911590022` 的上传与来源证明步骤成功,但末尾核对在 24 次重试后仍 404,整次运行标红;重跑 `40918429580` 在发布步骤报 `E409 Cannot publish over previously staged version "0.9.13"`,由此确认**当前可信发布者绑定只允许暂存发布**:版本进入 npm staged 区,需维护者 2FA 批准后才公开。维护者批准后,注册表 `latest = 0.9.13`。
2343
+ - **发布后核验。** 来源证明类型 `https://slsa.dev/provenance/v1`,`gitCommit` 为发布提交,工作流引用 `refs/tags/v0.9.13`,invocation 为 `40911590022`;tarball SHA1 `ca2c754e3421cddd14a795c5b4d869c5ea4b3cf9`、SHA512 与注册表一致,69 个条目、解包 131,263,175 字节。全新隔离 `DSH_HOME`(`/tmp/dsh-verify-0913`,pnpm 从 npm 安装,不是 link)在真实 `0.2.2-alpha.2` 宿主上启动,`https://127.0.0.1:3098/phone/health` 返回 200,`serverVersion` 为 `0.9.13`、`dataPlane: true`;GitHub Release 在这一步通过后才公开并标记 Latest。
2344
+ - **流程变更。** 用户决定保留暂存流程;批准步骤与「工作流末尾核对在批准前必然失败」已写入 `docs/NPM_PUBLISHING.md` 与 `AGENTS.md` 发布第 4–5 步。工作流本身未改:末尾核对在 staged 版本上仍会标红,是否改成「检测到 staged 即视为成功并输出待批准」留待下次发布前决定。
2345
+ - **局限。** 未做真机、Funnel 端到端、真实 `updateBundle`/HMR 回滚安装,也没有在 `0.2.1-rc.4` 上做真实业务回合;上述健康检查只证明插件能被宿主组合、启动并应答。
@@ -34,6 +34,12 @@
34
34
  npm 不在保存配置时验证绑定;首次发布成功才证明认证可用。
35
35
  4. 新绑定必须在 **2 天内完成首次成功发布**。因此准备好新版本后再绑定;若过期,
36
36
  删除过期绑定并重新创建。先验证可信发布成功,再按需调整原有令牌发布权限。
37
+ 5. **2026-10-29 实测:当前绑定只允许暂存发布。** `publish.yml` 里的 `npm publish`
38
+ 不再直接公开版本,而是把它送进 staged 区(命令返回成功并提示“正在处理”,
39
+ 但注册表的版本、tarball 与来源证明持续 404)。用户决定**保留暂存流程**:
40
+ 每次发版由工作流暂存,维护者用 2FA 批准后才公开(步骤见第三节)。
41
+ 若要恢复直接发布,需在包设置的 Trusted Publisher 中勾选 `Allow npm publish`
42
+ (账户强制 2FA 时可能不可用),并同步改本节、AGENTS.md 与第 4 步的核对逻辑。
37
43
 
38
44
  ## 三、每次发布
39
45
 
@@ -63,7 +69,14 @@
63
69
  压缩包发布跳过生命周期脚本(`--ignore-scripts`);测试、类型检查和构建已在前序
64
70
  步骤执行,打包仍执行 `prepack`(打包前构建)。发布后核对版本、分发标签、
65
71
  压缩包完整性和来源证明元数据。
66
- 6. 确认 npm 包可安装,在全新 DSH 配置中完成安装验证后,再公开 GitHub 发布草稿。
72
+ 6. **批准暂存版本(暂存模式下必需)。** 工作流把版本送进 staged 区后,由维护者完成
73
+ 2FA 批准:在 npmjs.com 的 **Staged Packages** 标签找到
74
+ `dsh-deeppilot@<版本>` → Approve;或本机 `npm login` 后
75
+ `npm stage list dsh-deeppilot` → `npm stage approve <id>`。
76
+ 批准即公开该版本,并按发布命令写入分发标签(`latest` / `alpha`)。
77
+ 工作流末尾「核对发布版本、包完整性与来源证明」在批准前必然 404 失败、整次运行标红;
78
+ 这是暂存模式的预期结果,不代表上传失败,发布证据以批准后的手工核验为准。
79
+ 7. 确认 npm 包可安装,在全新 DSH 配置中完成安装验证后,再公开 GitHub 发布草稿。
67
80
  工作流不自动公开发布草稿;npm 上传和发布后的核对分别记录在步骤中。
68
81
 
69
82
  ## 四、失败处理与证据边界
@@ -156,6 +169,25 @@
156
169
  **遗留处理:** `0.9.10` 的 GitHub Release 原为 Draft,按用户决定于本轮**删除**
157
170
  (远端标签 `v0.9.10` 与 npm 上的 `0.9.10` 包均保留,未做任何版本删除或回撤)。
158
171
 
172
+ 11. `0.9.13` 的实际发布结果(2026-10-29/30):附注标签 `v0.9.13` 指向
173
+ `0107efb584be4031af7279eb9f6cdf4404189081`,该提交的 CI(运行号
174
+ `40910195877`,7 分 27 秒)与 CodeQL(运行号 `40910195831`)均绿。
175
+ `publish.yml` 首次运行 `40911590022` 的上传与来源证明步骤成功,但末尾核对在
176
+ 24 次重试后仍抛 `读取 npm 发布信息失败(dsh-deeppilot/0.9.13,HTTP 404)`,
177
+ 整次运行标红;重跑 `40918429580` 在发布步骤报
178
+ `E409 Cannot publish over previously staged version "0.9.13"`。由此确认
179
+ **当前绑定只允许暂存发布**,版本进入 staged 区后需维护者 2FA 批准(见第二节
180
+ 第 5 条与第三节第 6 步)。批准后注册表 `latest = 0.9.13`;来源证明类型为
181
+ `https://slsa.dev/provenance/v1`、`gitCommit` 为该提交、工作流引用
182
+ `refs/tags/v0.9.13`、invocation 为 `40911590022`;tarball SHA1
183
+ `ca2c754e3421cddd14a795c5b4d869c5ea4b3cf9` 与 SHA512 同注册表一致,共 69 个
184
+ 条目、解包 131,263,175 字节。随后在全新隔离 `DSH_HOME` 中从 npm 安装
185
+ `dsh-deeppilot@0.9.13`(pnpm 安装,不是 link),用真实 `0.2.2-alpha.2` 宿主
186
+ 启动,插件自有端口 3098 的 `/phone/health` 返回 200,`serverVersion` 为
187
+ `0.9.13`、`dataPlane: true`;GitHub Release 在这一步通过后才公开并标记 Latest。
188
+ 暂存流程与批准步骤已写入第二、三节与 `AGENTS.md`;工作流末尾核对在暂存模式下
189
+ 的标红问题本轮未改,留待下次发布前决定是否检测 staged 后按成功处理。
190
+
159
191
  ## 五、官方资料
160
192
 
161
193
  1. [npm 可信发布配置与限制](https://docs.npmjs.com/trusted-publishers/)