dsh-deeppilot 0.9.6 → 0.9.8

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,25 +1,27 @@
1
1
  # Compatibility
2
2
 
3
- This branch targets exactly **three DSH releases**: `0.2.0-rc.2`, which the npm
4
- `latest`/`next` channels point at, and `0.2.1-alpha.3` and `0.2.1-alpha.4`, which
5
- the `alpha` channel has pointed at in turn. All three are named in both
6
- `engines.dsh` and `peerDependencies`; no other version is accepted. DSH evaluates
7
- that declaration before composing a profile — on every start, not only on
8
- install — so a newly published DSH release deactivates this plugin until the
9
- list is widened deliberately. That is the intended trade: a plugin that cannot
10
- run on an unaudited host fails visibly instead of misbehaving quietly. The
11
- decision and the reversal it represents are recorded in
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
7
+ named in both `engines.dsh` and `peerDependencies`; no other version is accepted.
8
+ DSH evaluates that declaration before composing a profile — on every start, not
9
+ only on install — so a newly published DSH release deactivates this plugin until
10
+ the list is widened deliberately. That is the intended trade: a plugin that
11
+ cannot run on an unaudited host fails visibly instead of misbehaving quietly.
12
+ The decision and the reversal it represents are recorded in
12
13
  [`docs/决策记录.md`](./docs/决策记录.md) (章节一), with the supporting audit in
13
14
  [`docs/DSH_RELEASE_MEMORY.md`](./docs/DSH_RELEASE_MEMORY.md).
14
15
 
15
16
  The development packages this branch builds and typechecks against stay pinned
16
- to the exact release-candidate baseline, currently `0.2.0-rc.2`; the alpha host
17
- is covered by the isolated compose and live-runs recorded in the release memory.
17
+ to the exact release-candidate baseline, currently `0.2.0-rc.2`; the audited
18
+ `alpha` and `rc` hosts are covered by the isolated composes and live runs
19
+ recorded in the release memory.
18
20
 
19
21
  | Component | Current contract | Evidence |
20
22
  |---|---|---|
21
23
  | Node.js | 22 or newer | Package engine and CI |
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` (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 |
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) |
23
25
  | iOS bridge | DeepPilot protocol v2 | Bridge protocol tests; device behavior must be checked with the running Host and app |
24
26
  | Remote access | Tailscale Funnel on ports 443, 8443, or 10000 | Helper and supervisor tests |
25
27
 
@@ -71,6 +73,99 @@ carries the old top-level `debug: true` is accepted but that value is ignored:
71
73
  verbose logging must be turned on again from the settings page. No other config
72
74
  field changed shape, and the old key is not read anywhere in this version.
73
75
 
76
+ ## 0.2.1-rc.2 audit outcome
77
+
78
+ The artifact-level audit of `dsh-v0.2.1-rc.2` against `dsh-v0.2.1-alpha.5` found
79
+ no change that reaches this plugin's call surface. Fifteen packages were compared
80
+ as whole trees rather than by `lib/` alone: all ten peer packages carry
81
+ **byte-identical `lib/` trees**, and across 137 modules **no export symbol is
82
+ added or removed**. The 245 dependency differences are spec-value moves only,
83
+ with zero structural difference: 78 `@deepseek-ai/dsh*` entries are pinned to
84
+ `0.2.1-rc.2`, and five vendor ranges are promoted from prerelease to GA —
85
+ `cordis ~4.0.5-alpha.2` → `~4.0.5`, `schemastery ~3.18.5-alpha.2` → `~3.18.5`,
86
+ plus `cordis-plugin-include`, `cordis-plugin-loader`, and `cordis-plugin-timer`.
87
+ No dependency package name is added or removed.
88
+
89
+ **One file outside `package.json` differs, and it is additive.**
90
+ `@deepseek-ai/dsh-web-app/cordis.patch.yml` gained one hunk / +3−0 that inserts
91
+ the `ui-deepseek-model-label-1017` bundle (the DeepSeek-V4.1-Flash-1017
92
+ adaptation named in the rc.2 release notes). It cannot reach this plugin: the
93
+ patch anchor this plugin targets, `id: directory-picker`, is byte-identical at
94
+ lines 113–114 on both sides, the new entry sits at lines 412–417, and the new
95
+ package name appears zero times in this plugin's `cordis.patch.yml` and
96
+ `package.json`.
97
+
98
+ That file is also why the audit method changed: **comparing only `lib/` would
99
+ have missed it**, and it is exactly the surface this plugin's own patch layer
100
+ acts on. Whole-tree comparison is now a required step of every future audit, not
101
+ a fallback.
102
+
103
+ The vendor peers need no widening either. `0.2.1-rc.2` vendors the same GA pair
104
+ as `0.2.1-alpha.5` — `cordis 4.0.5` and `schemastery 3.18.5` — and four
105
+ independent solver paths (host-tree and repository `semver`, each with and
106
+ without `includePrerelease`) agree that both already satisfy the existing
107
+ `~4.0.4 || ~4.0.5-alpha.1` / `~3.18.4 || ~3.18.5-alpha.1` ranges.
108
+
109
+ The activation verdict is the same shape as alpha.5: rc.2 resolves the
110
+ requirements path from a declared `engines.dsh` alone, so its refusal names that
111
+ single requirement rather than the ten peers, and `exempted` is false because no
112
+ profile exemption file exists on the audit machine. Before the widening, a real
113
+ rc.2 CLI refused the unchanged declaration —
114
+
115
+ ```text
116
+ dsh: skipping profile bundle "dsh-deeppilot": … Plugin dsh-deeppilot@0.9.7 is incompatible with dsh 0.2.1-rc.2: requirements {"engines.dsh":"0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5"}. … Exact-version exemption: not active.
117
+ ```
118
+
119
+ — while the host itself still booted and served its web port. Three published
120
+ evaluators agree on all 14 candidates, and the widened declaration admits
121
+ `0.2.1-rc.2` while adding no other acceptance. **`0.2.1-rc.1` is deliberately not
122
+ added and remains refused**: the rc line reached this plugin one release later, so
123
+ admitting the earlier rc would extend support to a host that was never audited as
124
+ its own. `0.2.1-alpha.1`, `0.2.1-alpha.2`, `0.2.0-rc.1`, `0.2.0`, `0.2.1`,
125
+ `0.2.1-rc.3`, `0.3.0-rc.1`, `0.3.0`, `1.0.0`, and `0.1.7-rc.2` remain refused.
126
+
127
+ **Audit limits, stated rather than implied.** Loading this plugin on a real
128
+ isolated `0.2.1-rc.2` host — the positive half of the rc.2 verification — had
129
+ **not** been completed when this entry was written; the rc.2 evidence here is the
130
+ pre-widening refusal log plus the published evaluators' verdict on the widened
131
+ declaration. Until the positive load and the full release check set run against
132
+ that host, this release is recorded as audited at the declaration and
133
+ artifact-diff level only; no plugin release has been made from this tree, and
134
+ nothing here claims one.
135
+
136
+ ## 0.2.1-alpha.5 audit outcome
137
+
138
+ The source-level audit of `dsh-v0.2.1-alpha.5` against `dsh-v0.2.1-alpha.4` found
139
+ no runtime break. Of the ten peer packages, **nine have byte-identical `lib/`
140
+ trees** — including `dsh-api-gateway` and the three Client faces the resident
141
+ interaction client loads — so every alpha.3 fix still holds unchanged. Only
142
+ `dsh-api-remotes/lib/client.js` differs: three hunks / 36 lines, all inside the
143
+ `account/getUnnotifiedBonuses` result schema, where the new optional `title`
144
+ field arrives while `campaign`, `amount`, `currency`, and `grantedAt` become
145
+ optional and are forwarded without validation. The file's exported symbols are
146
+ identical, and this plugin does not consume that endpoint, so the change is
147
+ additive from here.
148
+
149
+ The vendor peers need no widening either: both hosts' vendor pins moved from
150
+ prerelease to GA — `cordis 4.0.5-alpha.2` → `4.0.5` and `schemastery
151
+ 3.18.5-alpha.2` → `3.18.5` — and both GA releases already satisfy the existing
152
+ `~4.0.5-alpha.1` / `~3.18.5-alpha.1` ranges.
153
+
154
+ The activation verdict is the same shape as alpha.4, with one difference: alpha.5
155
+ resolves the requirements path from a declared `engines.dsh` alone, so its
156
+ refusal names that single requirement rather than the ten peers. Adding
157
+ `0.2.1-alpha.5` to the closed list therefore makes it activate, and the four
158
+ audited hosts pass while `0.2.1-alpha.1`, `0.2.1-alpha.2`, `0.2.0-rc.1`, `0.2.0`,
159
+ `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
160
+ refused.
161
+
162
+ **Audit limits, stated rather than implied.** Loading this plugin on a real
163
+ isolated `0.2.1-alpha.5` host, and the full release check set (unit tests,
164
+ typecheck, build, config-schema check, helper tests) against that host, had
165
+ **not** been completed when this entry was written. Until they are, this release
166
+ is recorded as audited at the declaration and source-diff level only; no plugin
167
+ release has been made from this tree, and nothing here claims one.
168
+
74
169
  ## 0.2.1-alpha.4 audit outcome
75
170
 
76
171
  The source-level audit of `dsh-v0.2.1-alpha.4` against `dsh-v0.2.1-alpha.3` found
@@ -89,10 +184,11 @@ plugin's `engines.dsh` range **alone**, ignoring `peerDependencies` entirely
89
184
  whenever that field is present. A package that declares no `engines.dsh` — as
90
185
  this one did — keeps the older peer evaluation, so the previously exact peer
91
186
  list rejected `0.2.1-alpha.4` and the plugin would not have activated on it.
92
- Both declarations now name the same three releases. The audit reproduced that
93
- refusal against the published `evaluatePluginCompatibility` of both hosts before
94
- changing anything, and the same harness confirms the three audited hosts pass
95
- while `0.2.1-alpha.2`, `0.2.1-alpha.5`, `0.2.1`, and `0.3.0` still fail.
187
+ Both declarations were widened from the previous three-release list to the same
188
+ four releases. The audit reproduced that refusal against the published
189
+ `evaluatePluginCompatibility` of both hosts before changing anything, and the
190
+ same harness confirms the four audited hosts pass while `0.2.1-alpha.2`,
191
+ `0.2.1`, and `0.3.0` still fail.
96
192
 
97
193
  Nothing else moved. Protocol v2, pairing state, and device records are untouched,
98
194
  so no paired phone needs to re-pair, and the vendor peers need no widening: both
@@ -175,8 +271,13 @@ needs a documentation update, not a peer-range widening.
175
271
  > versions actually audited, `0.2.0-rc.2` and `0.2.1-alpha.3`; see the
176
272
  > 0.2.1-alpha.3 outcome above and `docs/决策记录.md` (章节一). The paragraphs in
177
273
  > this historical entry describe the policy as it stood on 2026-09-29.
178
- > `0.2.1-alpha.4` was added the next day by the same deliberate audit step, and
179
- > the list now lives in `engines.dsh` as well as in `peerDependencies`.
274
+ > **This note is in turn superseded:** `0.2.1-alpha.4` was added the next day by
275
+ > the same deliberate audit step, `0.2.1-alpha.5` on 2026-10-16, and
276
+ > `0.2.1-rc.2` on 2026-10-17 — each one its own audit, never an automatic
277
+ > consequence of a new DSH tag. The closed five-release list now lives in
278
+ > `engines.dsh` as well as in `peerDependencies`. `0.2.1-rc.1` shows zero code
279
+ > delta on this plugin's call surface but is deliberately left out, because it
280
+ > was never audited as its own host. See the 0.2.1-rc.2 outcome above.
180
281
 
181
282
  ## 0.2.0-rc.1 audit outcome
182
283
 
package/README.md CHANGED
@@ -32,17 +32,19 @@ 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 three 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` and `0.2.1-alpha.4` — with a `web` profile. DSH
38
- checks a plugin's declared requirements before composing a profile, on every
39
- start rather than only on install, so any other host version refuses to activate
40
- this plugin. From DSH `0.2.1-alpha.4` on, that check reads `engines.dsh` and
41
- ignores `peerDependencies`; older hosts know only the peer range, so both name
42
- the same three releases. The package includes Funnel helpers for macOS, Linux,
43
- and Windows on amd64/arm64; trusted-LAN mode does not require the helper.
44
-
45
- The current working tree names exactly those three versions in `engines.dsh` and
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
39
+ requirements before composing a profile, on every start rather than only on
40
+ install, so any other host version refuses to activate this plugin. From DSH
41
+ `0.2.1-alpha.4` on, that check reads `engines.dsh` and ignores
42
+ `peerDependencies`; older hosts know only the peer range, so both name the same
43
+ five releases. The package includes Funnel helpers
44
+ for macOS, Linux, and Windows on amd64/arm64; trusted-LAN mode does not require
45
+ the helper.
46
+
47
+ The current working tree names exactly those five versions in `engines.dsh` and
46
48
  `peerDependencies` and is built/typechecked against `0.2.0-rc.2`. A previously
47
49
  published plugin package may still carry its own older compatibility
48
50
  declaration until a release is made from this tree.
package/README.zh-CN.md CHANGED
@@ -30,16 +30,17 @@
30
30
 
31
31
  ## 从 npm 安装
32
32
 
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`。DSH 在组合 profile 前会校验插件声明的兼容要求,且
36
- **每次启动都会校验**(不只是安装时),因此其他宿主版本会拒绝激活本插件。
37
- 从 DSH `0.2.1-alpha.4` 起,该校验只读 `engines.dsh` 并忽略
38
- `peerDependencies`;更早的宿主只认 peer 范围,因此两处列出同一组三个版本。
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` 通道)。
36
+ DSH 在组合 profile 前会校验插件声明的
37
+ 兼容要求,且**每次启动都会校验**(不只是安装时),因此其他宿主版本会拒绝
38
+ 激活本插件。从 DSH `0.2.1-alpha.4` 起,该校验只读 `engines.dsh` 并忽略
39
+ `peerDependencies`;更早的宿主只认 peer 范围,因此两处列出同一组五个版本。
39
40
  npm 包内置 macOS、Linux、Windows 的 amd64/arm64 Funnel helper;可信局域网
40
41
  模式不依赖 helper。
41
42
 
42
- 当前工作树的 `engines.dsh` 与 `peerDependencies` 精确列出这三个版本,构建与
43
+ 当前工作树的 `engines.dsh` 与 `peerDependencies` 精确列出这五个版本,构建与
43
44
  类型检查针对 `0.2.0-rc.2`。从此工作树发布新版本前,已发布的旧插件包仍可能
44
45
  带有各自旧的兼容声明。
45
46
 
@@ -3,7 +3,196 @@
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-alpha.4`
6
+ ## Current decision — `dsh-v0.2.1-rc.2`
7
+
8
+ - **Audited release:** `dsh-v0.2.1-rc.2`, published 2026-10-17T08:36:31.655Z. It is
9
+ **not** `latest`: `latest` still points at `0.2.0-rc.2`, and `alpha` still points
10
+ at `0.2.1-alpha.5`. It **is** the npm **`next`** channel release — this is the
11
+ first release on the rc line to enter the supported list.
12
+ - **Comparison baseline:** `dsh-v0.2.1-alpha.5` (the previous audited tag).
13
+ - **Plugin runtime verdict: no break, and no `src/` change was needed.** Fifteen
14
+ packages were compared **as whole trees, not by `lib/` alone**: all ten peer
15
+ packages ship a byte-identical `lib/` tree, and across 137 modules **no export
16
+ symbol is added or removed**, so every earlier fix still holds unchanged.
17
+ - **The one file outside `package.json` that differs is additive.**
18
+ `@deepseek-ai/dsh-web-app/cordis.patch.yml` gained one hunk / +3−0 inserting the
19
+ `ui-deepseek-model-label-1017` bundle (the DeepSeek-V4.1-Flash-1017 adaptation
20
+ named in the release notes). The patch anchor this plugin targets,
21
+ `id: directory-picker`, is byte-identical at lines 113–114 on both sides, the new
22
+ entry sits at lines 412–417, and the new package name appears zero times in this
23
+ plugin's `cordis.patch.yml` and `package.json`, so the change cannot reach any
24
+ patch this plugin applies.
25
+ - **Methodology change, now mandatory.** Comparing only `lib/` would have missed
26
+ exactly that file — and it is the surface this plugin's own patch layer acts on.
27
+ Whole-tree comparison is a required step of every future audit; do not fall back
28
+ to a `lib/`-only diff. See "Re-audit rule" below.
29
+ - **Activation verdict: the new release is admitted by both declarations, and the
30
+ earlier rc on the same line is deliberately left out.** This is the fourth
31
+ consecutive release on this line to trip the closed-list policy: rc.2 was refused
32
+ before the widening. rc.2 reads a declared `engines.dsh` alone, so its refusal
33
+ reported a **single** `engines.dsh` requirement rather than ten peers, and
34
+ `exempted: false` — the list is the only thing that admits a host, and no
35
+ exemption fallback exists on this machine (no profile `compatibility.json` under
36
+ `DSH_HOME`). Widening admits `0.2.1-rc.2` and nothing else. `0.2.1-rc.1` stays
37
+ refused even though it shows **zero code delta on this plugin's call surface**:
38
+ it was never audited as its own host, and the rc line reached this plugin one
39
+ release later.
40
+ - **Evidence: the published artifacts, the published evaluators, and a real rc.2
41
+ CLI run — all taken before any declaration changed.**
42
+ - **Change surface:** `.rc2-verify/CHANGE_SURFACE.md`. Raw logs:
43
+ `.rc2-verify/logs/lib-hash-compare.txt` and `lib-diff-exitcodes.txt` (10 of 10
44
+ peer `lib/` trees byte-identical), `whole-tree-compare.txt` (the 15-package
45
+ whole-tree fallback, which is what surfaced the `dsh-web-app` patch file),
46
+ `export-symbol-diff.out.json` (137 modules, zero symbol changes),
47
+ `pkg-manifest-delta.out.json` (245 spec-value differences, zero structural
48
+ differences), `webapp-cordis-patch-diff.txt` and `patch-anchor-verification.txt`
49
+ (the one differing file and its anchor), `rc1-delta.txt` (`0.2.1-rc.1` has zero
50
+ code delta on this plugin's call surface), and `evaluator-repro.out.json`
51
+ (three published evaluators × 14 candidates, all agreeing).
52
+ - **Activation decision, reproduced against rc.2's own published evaluator
53
+ before any edit:** `.rc2-verify/ACTIVATION.md` and `rc2-matrix.out.json`.
54
+ Unchanged, rc.2 was refused with a single `engines.dsh` requirement and
55
+ `exempted: false`; deleting `engines.dsh` from a copy of the manifest fell back
56
+ to all ten peers, confirming the short-circuit is unchanged. Projecting the
57
+ widening in memory admitted exactly `0.2.1-rc.2` with zero new refusals, while
58
+ `0.2.1-rc.3`, `0.2.1-rc.20`, `0.2.1-rc.2.1`, `0.2.1-RC.2`, and `0.2.1-rc.10`
59
+ stayed refused (`rc2-matrix-projected.out.json`).
60
+ - **Real CLI refusal, captured while the declaration was still unchanged:**
61
+ `.rc2-verify/PRECHANGE-BOOT.md`. Under an isolated `DSH_HOME` the real rc.2 CLI
62
+ printed `dsh: skipping profile bundle "dsh-deeppilot": … incompatible with dsh
63
+ 0.2.1-rc.2: requirements {"engines.dsh":…}` plus `Exact-version exemption: not
64
+ active.`, `--dump-config` exited 0 with no plugin row in the composed tree, and
65
+ the host itself still booted (web port answered, while the plugin's own port
66
+ 3098 had no listener). Raw logs: `PRECHANGE-dumpconfig.stderr.txt`,
67
+ `PRECHANGE-dumpconfig.stdout.txt`, `PRECHANGE-host.log`, `PRECHANGE-probes.txt`.
68
+ A control run of the same profile under the `0.2.1-alpha.5` CLI — which admits
69
+ `0.9.7` — loaded the plugin and answered `200` on port 3098
70
+ (`PRECHANGE-control-alpha5-host.log`, `PRECHANGE-control-alpha5-probes.txt`),
71
+ showing the negative probe has discriminating power.
72
+ - **Vendor pins: no range change needed.** rc.2 vendors the same GA pair as
73
+ alpha.5 — `cordis 4.0.5` and `schemastery 3.18.5` — and four independent solver
74
+ paths (host-tree and repository `semver`, each with and without
75
+ `includePrerelease`) agree both already satisfy the existing `~4.0.4 ||
76
+ ~4.0.5-alpha.1` / `~3.18.4 || ~3.18.5-alpha.1` ranges
77
+ (`.rc2-verify/rc2-vendor.out.json`). Neither vendor published a new
78
+ per-DSH-release dist-tag for rc.2; their `latest` is already `4.0.5` / `3.18.5`.
79
+ - **Install verdict: the two declarations now agree on five releases.**
80
+ `engines.dsh` and all ten `@deepseek-ai/dsh*` peers name `0.2.0-rc.2 ||
81
+ 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5 || 0.2.1-rc.2`, mirrored in
82
+ `tests/compatibility-metadata.test.ts`, `package-lock.json` (root entry only),
83
+ both READMEs, `COMPATIBILITY.md`, `AGENTS.md`, and the local
84
+ `docs/决策记录.md` (章节一, 条目5). The tests now also pin `0.2.1-rc.1` and
85
+ `0.2.1-rc.3` as negative probes, so neither the skipped rc nor the next rc can be
86
+ admitted by accident. The dev pins and `DSH_BASELINE` stay at the exact
87
+ `0.2.0-rc.2` this branch builds and typechecks against.
88
+ - **Protocol verdict: no phone-protocol change.** Protocol v2, pairing state, and
89
+ 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.
96
+
97
+ ### Previous decision — `dsh-v0.2.1-alpha.5`
98
+
99
+ - **Audited release:** `dsh-v0.2.1-alpha.5`, the newest `alpha` channel release.
100
+ It is **not** `latest`; `latest`/`next` still point at `0.2.0-rc.2`.
101
+ *(Superseded 2026-10-17 by `dsh-v0.2.1-rc.2`: `next` now points at
102
+ `0.2.1-rc.2`. `alpha` still points at `0.2.1-alpha.5` and `latest` still points
103
+ at `0.2.0-rc.2`. See the current decision above.)*
104
+ - **Comparison baseline:** `dsh-v0.2.1-alpha.4` (the previous audited tag).
105
+ - **Plugin runtime verdict: no break, and no `src/` change was needed.** Nine of
106
+ the ten peer packages ship a byte-identical `lib/` tree, including
107
+ `dsh-api-gateway` and the three Client faces the resident interaction client
108
+ loads, so every alpha.3 fix still holds unchanged.
109
+ - **The one code difference is schema-only and additive.**
110
+ `@deepseek-ai/dsh-api-remotes/lib/client.js` is the only differing `lib/` file
111
+ among the ten peers: **three hunks, 36 changed lines** (14 insertions, 22
112
+ deletions), all inside the `account/getUnnotifiedBonuses` result schema. The
113
+ new `title` field is added as optional; `campaign`, `amount`, `currency`, and
114
+ `grantedAt` are relaxed to optional and the first three lose their validation
115
+ (`campaign` becomes "forwarded without validation", `amount` and `currency`
116
+ become unconstrained JSON); only the descriptions of `expiresAt` changed.
117
+ `orderId`, `expiresAt`, and `message` stay required. The module's **exported
118
+ symbols are identical** — both versions assign exactly `exports.apply` and
119
+ `exports.inject` — and this plugin does not consume that endpoint, so the
120
+ change cannot reach any call it makes.
121
+ - **Activation verdict: the new release is admitted by both declarations.** This
122
+ is the third consecutive release on this line to trip the deliberate
123
+ closed-list policy: alpha.5 was refused before the widening. alpha.5 reads a
124
+ declared `engines.dsh` alone, so its refusal reported a **single**
125
+ `engines.dsh` requirement rather than ten peers, and `exempted: false` — the
126
+ list is the only thing that admits a host, and no exemption fallback exists on
127
+ this machine (no profile `compatibility.json`).
128
+ - **Evidence: reproduced against the published evaluator, plus an isolated
129
+ host run.** The audit called alpha.5's own published
130
+ `evaluatePluginCompatibility` with empty exemptions against this plugin's real
131
+ `package.json`, over one candidate list. Raw output:
132
+ `.alpha5-verify/tmp-matrix-early.out.json` (13 candidates, `matrixAllPass:
133
+ true`) and `.alpha5-verify/stage1-baseline.out.json` (the pre-change baseline).
134
+ Accepted after the change: `0.2.1-alpha.5`, `0.2.1-alpha.3`,
135
+ `0.2.1-alpha.4`, and the stable `latest` host. Still refused:
136
+ `0.2.1-alpha.1`, `0.2.1-alpha.2`, `0.2.0-rc.1`, `0.2.0`, `0.2.1-rc.1`,
137
+ `0.2.1`, `0.3.0-rc.1`, `0.3.0`, `1.0.0`, and `0.1.7-rc.2`. The same file
138
+ confirms declaration sync: `engines.dsh` equals the `@deepseek-ai/dsh` peer
139
+ range, all ten peers share one range, and the token count is 4.
140
+ `.alpha5-verify/VERIFICATION.md` separately records the refusal on an isolated
141
+ alpha.5 host: `dsh: skipping profile bundle "dsh-deeppilot": … incompatible
142
+ with dsh 0.2.1-alpha.5: requirements {"engines.dsh":…}`, with the host itself
143
+ still booting (`/phone/health` → 404, so the plugin was genuinely not loaded).
144
+ `.alpha5-verify/stage1-dumpconfig-phaseA.stderr.txt`,
145
+ `stage1-dumpconfig-phaseA.stdout.txt`, and `stage1-host-phaseA.log` hold the
146
+ raw logs.
147
+ - **Vendor pins promoted to GA, with no range change needed.** Both hosts'
148
+ vendored third parties moved from prerelease to GA — `cordis
149
+ 4.0.5-alpha.2` → `4.0.5`, `schemastery 3.18.5-alpha.2` → `3.18.5`. Both GA
150
+ releases already satisfy the existing `~4.0.5-alpha.1` / `~3.18.5-alpha.1`
151
+ ranges, so the two vendor peers stay as they are.
152
+ `.alpha5-verify/stage1-semver-vendor.out.json` cross-checks that with four
153
+ independent solver paths (host `semver` and repo `semver`, each with and
154
+ without `includePrerelease`), all four agreeing.
155
+ - **Install verdict: the two declarations now agree on four releases.**
156
+ `engines.dsh` and all ten `@deepseek-ai/dsh*` peers name `0.2.0-rc.2 ||
157
+ 0.2.1-alpha.3 || 0.2.1-alpha.4 || 0.2.1-alpha.5`, mirrored in
158
+ `tests/compatibility-metadata.test.ts`, `package-lock.json` (root entry only),
159
+ both READMEs, `COMPATIBILITY.md`, `AGENTS.md`, and the local
160
+ `docs/决策记录.md` (章节一, 条目4). The dev pins and `DSH_BASELINE` stay at the
161
+ exact `0.2.0-rc.2` this branch builds and typechecks against.
162
+ - **Protocol verdict: no phone-protocol change.** Protocol v2, pairing state, and
163
+ device records are untouched by this release; no phone needs to re-pair.
164
+ - **Post-widening verification — completed for the 0.9.7 preparation.**
165
+ - **C7 — real load on an isolated alpha.5 host: passed.** With the widened
166
+ declaration in place, the profile that used to be refused now composes and
167
+ starts. `--dump-config` writes nothing to stderr and no longer emits
168
+ `skipping profile bundle` (the pre-change baseline emitted 21 such lines); the
169
+ composed tree contains `# == dsh-deeppilot` together with
170
+ `# == @deepseek-ai/dsh-web-app, patched by dsh-deeppilot`; the running host
171
+ logs four `[deeppilot]` lines (`device registry loaded`, `data plane active`,
172
+ `LAN TLS identity created`, `local transport listening on https://0.0.0.0:3098`);
173
+ and `https://127.0.0.1:3098/phone/health` answers `200` with
174
+ `{"ok":true,"enabled":true,"protocolVersion":2,"serverVersion":"0.9.6","dataPlane":true}`.
175
+ - **Probe note — use the plugin's own listener, not DSH's web port.** The
176
+ pre-change baseline cited `http://127.0.0.1:3281/phone/health = 404` as its
177
+ refusal evidence. That probe has no discriminating power: `/phone/health` is
178
+ served by this plugin's own narrow LAN listener (`src/phone-server.ts`), which
179
+ by design never inherits DSH's wider web/API route surface, so the DSH web
180
+ port answers 404 whether or not the plugin loaded. The valid refusal evidence
181
+ was the skip warning; the valid positive evidence is port 3098.
182
+ - **C5/C6 — the full check set: passed in the release tree.** Clean `npm ci`,
183
+ repo-wide `npm test` (564 tests, 563 pass, 0 fail, 1 pre-existing TODO),
184
+ `npm run typecheck`, `npm run build` (regenerated `lib/` byte-identical to the
185
+ committed tree), `npm run check:config-schema` against the pinned
186
+ `0.2.0-rc.2` CLI, `go test ./...` for the helper, and all six
187
+ `bin/SHA256SUMS` entries verified.
188
+ - **Published as 0.9.7 on 2026-10-17.** `npm view dsh-deeppilot dist-tags` reads
189
+ `latest: 0.9.7`, and the version carries an npm provenance attestation
190
+ (`https://slsa.dev/provenance/v1`). The release commit `bf18755` is on `main`,
191
+ the annotated tag `v0.9.7` dereferences to it, and the GitHub release was made
192
+ public only after a clean-profile install had been verified — see the publish
193
+ verification section below.
194
+
195
+ ### Previous decision — `dsh-v0.2.1-alpha.4`
7
196
 
8
197
  - **Audited release:** `dsh-v0.2.1-alpha.4` (official release page:
9
198
  <https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.2.1-alpha.4>),
@@ -45,15 +234,20 @@
45
234
  hosts admit all three audited releases; alpha.4 reports a **single**
46
235
  `engines.dsh` requirement instead of ten peers when it refuses; and
47
236
  `0.2.1-alpha.2`, `0.2.1-alpha.5`, `0.2.1`, and `0.3.0` are still refused.
237
+ *(Historical: `0.2.1-alpha.5` was admitted the next day by the audit above.)*
48
238
  alpha.3 ignores `engines.dsh` entirely — the field did not exist yet — and
49
239
  keeps deciding on `peerDependencies`, which is why both declarations must name
50
240
  the same list.
51
- - **Install verdict: the two declarations now agree.** `engines.dsh` and all ten
52
- `@deepseek-ai/dsh*` peers name `0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4`,
53
- mirrored in `tests/compatibility-metadata.test.ts`, `package-lock.json`, both
241
+ - **Install verdict: the two declarations agreed at that point (widened since).**
242
+ `engines.dsh` and all ten `@deepseek-ai/dsh*` peers named `0.2.0-rc.2 ||
243
+ 0.2.1-alpha.3 || 0.2.1-alpha.4`, mirrored in
244
+ `tests/compatibility-metadata.test.ts`, `package-lock.json`, both
54
245
  READMEs, `COMPATIBILITY.md`, `AGENTS.md`, and the local `docs/决策记录.md`
55
246
  (章节一, 条目3). The dev pins and `DSH_BASELINE` stay at the exact
56
- `0.2.0-rc.2` this branch builds and typechecks against.
247
+ `0.2.0-rc.2` this branch builds and typechecks against. **Historical note:**
248
+ `0.2.1-alpha.5` was appended to both lists on 2026-10-16 by the audit above,
249
+ which now owns the current list; the four documentation mirrors that still
250
+ said「三个版本」were corrected there.
57
251
  - **Vendor peers need no widening.** Both hosts still vendor `cordis
58
252
  4.0.5-alpha.2` and `schemastery 3.18.5-alpha.2`; neither package published a
59
253
  `dsh-0-2-1-alpha-4` dist-tag, and the existing `~4.0.5-alpha.1` /
@@ -389,6 +583,120 @@
389
583
  bundle" below. The plugin needs no code change; the phone's copy now points
390
584
  at the bundle.
391
585
 
586
+ ## 2026-10-16 — audit of `dsh-v0.2.1-alpha.5`
587
+
588
+ The first release on this line whose entire plugin-facing change surface is
589
+ additive. It is the third consecutive release to trip the closed-list policy: a
590
+ new DSH tag refuses to activate this plugin until the list is widened by an
591
+ audit, which is the behaviour the 2026-10-14 reversal chose on purpose.
592
+
593
+ ### Method
594
+
595
+ The comparison used the **installed artifacts** of the alpha.4 and alpha.5 hosts
596
+ already unpacked on this machine, not release notes and not the monorepo: every
597
+ `@deepseek-ai/dsh*` peer package's `lib/` directory was compared file by file,
598
+ and the single differing file was then read as a diff. `dsh-client-ui-slots` is
599
+ not hoisted into either host's `node_modules` root (it resolves only inside a
600
+ composed profile), so both of its published versions were pulled from npm
601
+ (`0.2.1-alpha.4` and `0.2.1-alpha.5`, 31,973 bytes each) and compared in full to
602
+ close that gap rather than assume it.
603
+
604
+ ### Change surface
605
+
606
+ - **Nine of the ten peer packages carry a byte-identical `lib/` tree**:
607
+ `dsh`, `dsh-api-gateway`, `dsh-client-connection`, `dsh-client-locale`,
608
+ `dsh-client-ui-settings`, `dsh-client-ui-slots`, `dsh-settings`,
609
+ `dsh-typert-protocol`, `dsh-typert-registry`. The tenth is `dsh-api-remotes`.
610
+ - **`dsh-api-remotes/lib/client.js` — three hunks, 36 changed lines.** Every
611
+ hunk is the `account/getUnnotifiedBonuses` result schema:
612
+ - `title` is added, optional, described as a server-localised plain-text title
613
+ that absent responses replace with the localised bonus title.
614
+ - `campaign`, `amount`, `currency`, and `grantedAt` become optional; `campaign`
615
+ becomes unvalidated pass-through JSON, `amount` and `currency` lose their
616
+ string / `CNY|USD` constraints, and `grantedAt` loses its description.
617
+ - The JSON Schema side mirrors that: `title` is added to `properties`, and
618
+ `campaign`, `amount`, `currency`, and `grantedAt` are dropped from
619
+ `required`. `orderId`, `expiresAt`, and `message` remain required.
620
+ - **The exported symbols are unchanged**: the module assigns exactly
621
+ `exports.apply` and `exports.inject` on both sides.
622
+ - This plugin does not call `account/getUnnotifiedBonuses`, so even the field
623
+ that did tighten (`expiresAt`'s documented semantics) cannot reach it.
624
+ - **The vendor pins moved from prerelease to GA.** The `dsh` CLI's vendored
625
+ third parties went `cordis 4.0.5-alpha.2` → `4.0.5` and `schemastery
626
+ 3.18.5-alpha.2` → `3.18.5`. Both GA releases already satisfy the plugin's
627
+ existing `~4.0.5-alpha.1` / `~3.18.5-alpha.1` ranges, so **no vendor widening
628
+ was needed**; the ranges were left untouched.
629
+ - **The activation rule did not change again.** alpha.5 keeps alpha.4's
630
+ requirements path: a declared `engines.dsh` decides alone and short-circuits the
631
+ peer loop. That is why the refusal is reported as one requirement instead of
632
+ ten.
633
+
634
+ ### Validation evidence
635
+
636
+ - **Compatibility matrix against the published evaluator.** alpha.5's own
637
+ published `evaluatePluginCompatibility`, called with empty exemptions against
638
+ this plugin's real `package.json` over 13 candidates →
639
+ `.alpha5-verify/tmp-matrix-early.out.json`, `matrixAllPass: true`. Accepted:
640
+ `0.2.1-alpha.5` (the target), `0.2.1-alpha.3`, `0.2.1-alpha.4`, and the stable
641
+ host. Refused, each with `exempted: false`: `0.2.1-alpha.1`,
642
+ `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`,
643
+ `0.3.0`, `1.0.0`, `0.1.7-rc.2`. The same file's `declarationSync` block
644
+ reports `engines.dsh === @deepseek-ai/dsh peer range`, all ten peers on one
645
+ range, and four unique `engines.dsh` tokens.
646
+ - **Pre-change baseline, the same evaluator.** `.alpha5-verify/stage1-baseline.out.json`
647
+ shows the unchanged declaration refusing `0.2.1-alpha.5` with
648
+ `requirements: { "engines.dsh": "0.2.0-rc.2 || 0.2.1-alpha.3 || 0.2.1-alpha.4" }`
649
+ and `exempted: false` — the failure this audit removes.
650
+ - **Isolated alpha.5 host, pre-change.** `.alpha5-verify/VERIFICATION.md` and
651
+ `stage1-dumpconfig-phaseA.stderr.txt` record the real CLI refusing the plugin:
652
+ `dsh: skipping profile bundle "dsh-deeppilot": Error: Plugin
653
+ dsh-deeppilot@0.9.6 is incompatible with dsh 0.2.1-alpha.5: requirements
654
+ {"engines.dsh":…}`, `Exact-version exemption: not active`. The host still
655
+ booted (`stage1-host-phaseA.log`, `--port 3280`) and `/phone/health` returned
656
+ 404, which is what shows the plugin really was not loaded rather than silently
657
+ active.
658
+ - **Vendor semver, four independent paths.** `.alpha5-verify/stage1-semver-vendor.out.json`
659
+ resolves the two vendor ranges with the host tree's `semver` and the repo's
660
+ `semver`, each with and without `includePrerelease`; all four agree that
661
+ `4.0.5` and `3.18.5` (and the previously audited `4.0.4`, `4.0.5-alpha.2`,
662
+ `3.18.4`, `3.18.5-alpha.2`) satisfy, and that `9.9.9` does not.
663
+ - **Targeted unit test.** `node --import tsx --test tests/compatibility-metadata.test.ts`
664
+ → 5 tests, 5 pass, 0 fail, after `DSH_PEER_RANGE`, `DSH_ENGINES_RANGE`,
665
+ `DSH_ALPHA_HOSTS`, the rejection lists, and the vendor pins were updated. The
666
+ test file's contrast set still refuses `0.2.1-alpha.1`, `0.2.1-alpha.2`,
667
+ `0.2.0`, `0.2.1-rc.1`, `0.2.1`, `0.3.0`, and `1.0.0`, so the widening did not
668
+ turn into an open range.
669
+
670
+ ### Verification status
671
+
672
+ - **C7 — real load on an isolated alpha.5 host: passed.** The same isolated
673
+ profile that was refused before the widening now composes and starts: no
674
+ `skipping profile bundle` warning (0 bytes on stderr, was 21 lines), the tree
675
+ contains `# == dsh-deeppilot` and the web-app patch, the host logs four
676
+ `[deeppilot]` lines, and `https://127.0.0.1:3098/phone/health` answers `200`
677
+ with `serverVersion` matching the tree under test. The run happened before the
678
+ version bump, so that field read `0.9.6`; the release tree differs from the tree
679
+ under test only in the declaration documents and the version fields. Port 3098 —
680
+ not DSH's web port — is the probe with discriminating power; see the note under
681
+ Current decision.
682
+ - **The full check set for this tree (C5/C6): passed.** Clean `npm ci`, repo-wide
683
+ `npm test` (564 tests, 563 pass, 0 fail, 1 pre-existing TODO),
684
+ `npm run typecheck`, `npm run build` with a byte-identical regenerated `lib/`,
685
+ `npm run check:config-schema` against the pinned `0.2.0-rc.2` CLI, the Go helper
686
+ tests, and the six `bin/SHA256SUMS` entries.
687
+ - **Release action completed — 0.9.7 published on 2026-10-17.** The annotated tag
688
+ `v0.9.7` points at `bf18755` on `main`; the publish workflow ran on that tag and
689
+ all of its steps passed, including the post-publish registry check whose retry
690
+ window this release widened. Registry `latest` reads `0.9.7` with provenance,
691
+ and a clean isolated profile installed `dsh-deeppilot@0.9.7` from npm, composed
692
+ it on a real `0.2.1-alpha.5` host, and answered `/phone/health` with `200` and
693
+ `serverVersion: "0.9.7"`.
694
+ - **The declaration mirrors have drifted historically.** `README.md`,
695
+ `README.zh-CN.md`, `COMPATIBILITY.md`, and `AGENTS.md` all said "three
696
+ releases" while `package.json` already named four; that contradiction was
697
+ corrected in this pass. Any future widening must update all of them together —
698
+ the unit test only pins `package.json` and `package-lock.json`.
699
+
392
700
  ## 2026-10-15 — audit of `dsh-v0.2.1-alpha.4`
393
701
 
394
702
  `dsh-v0.2.1-alpha.4` reached npm on 2026-10-15T13:08:08Z, roughly 24 hours after
@@ -470,9 +778,10 @@ substitution the peer path performs, so any `workspace:` range there is unmet.
470
778
  peers as unmet. With the added `engines.dsh` range, both hosts admit all three
471
779
  audited releases; alpha.4 reports a **single** `engines.dsh` requirement
472
780
  instead of ten peers when it refuses; and `0.2.1-alpha.2`, `0.2.1-alpha.5`,
473
- `0.2.1`, and `0.3.0` remain refused. alpha.3 ignores `engines.dsh` entirely
474
- and keeps deciding on `peerDependencies`, which is why both declarations must
475
- name the same list.
781
+ `0.2.1`, and `0.3.0` remain refused.
782
+ *(Historical: `0.2.1-alpha.5` was admitted the next day — see the audit of that
783
+ release above.)* alpha.3 ignores `engines.dsh` entirely and keeps deciding
784
+ on `peerDependencies`, which is why both declarations must name the same list.
476
785
  - **Live A/B install on the published alpha.4 CLI — the evidence that matters.**
477
786
  Under an isolated `DSH_HOME`, the **unchanged** package was rejected outright:
478
787
  `dsh: installation rejected: Plugin dsh-deeppilot@0.9.5 is incompatible with
@@ -1435,3 +1744,30 @@ For every future DSH release, compare the new tag against the last audited tag,
1435
1744
  inspect the package/service surfaces actually imported by this repository,
1436
1745
  classify install/runtime/protocol risk separately, and append a dated decision
1437
1746
  here. Do not treat a release-note summary as proof of compatibility.
1747
+
1748
+ Compare **whole package trees**, not just `lib/`. The rc.2 audit found its only
1749
+ non-`package.json` difference in `@deepseek-ai/dsh-web-app/cordis.patch.yml`, a
1750
+ file outside every `lib/` directory and the exact surface this plugin's own patch
1751
+ layer acts on; a `lib/`-only diff would have reported "no difference" and missed
1752
+ it. Take the published registry tarballs as the source of truth, enumerate the
1753
+ package set explicitly (peers, plus every package raw `dsh` dependencies add or
1754
+ remove, plus any peer that is not hoisted into the host tree), and only then read
1755
+ release notes.
1756
+
1757
+ ## 2026-10-15 — 移动端技能发现扩展
1758
+
1759
+ 新增可选的 `skills` 手机能力,使用官方 `sessionSkillCatalog.list({sessionId}, AbortSignal)` 服务,已对照本机 `0.2.0-rc.2` 和 `0.2.1-alpha.3` 发行声明。缺少服务只关闭该特性,晚挂载服务会重新探测,不缓存缺席。未修改宿主版本范围、鉴权、包版本或命令派发契约。手机只接收元数据,技能注册表和会话预设、工作目录变化触发目录失效。完整文档清单与四类差异表见《技能提示对接说明》。此源码改动尚未发布,真实主机与真机技能加载仍未验收。
1760
+
1761
+ ## 2026-10-16 — 移动端系统指令扩展
1762
+
1763
+ 1. 安装:本轮命令改动未调整依赖范围、包版本或发布状态。命令接口核对基于 `0.2.0-rc.2` 与 `0.2.1-alpha.3`;工作区并行的 `alpha.4` 兼容改动以其独立审计为准,不把本轮合成测试算作新版本真实业务验收。
1764
+ 2. 运行:对照两版生成声明和实现,使用公开 `typertGateway.invoke` 的 `commands/list`、`commands/execute`、`fileUploads/upload`、`permissionPresets/catalog`、`sessionFeedback/record`;当前权限来自会话投影,日志复用官方共享 Fetch 归档路由。alpha.3 创建不参与审批的 owner Peer,rc.2 回退既有 operator。详情及上游全接口清单见[移动端命令对接说明](移动端命令对接说明.md)。
1765
+ 3. 手机协议:v2 可选 `commands` 能力和五个新请求;读取使用 `sessions.read`,执行/反馈使用 `prompt.send`,小组件默认拒绝。旧手机忽略新字段,旧桥接不展示新增入口。导出分块不重放,接收方完整校验后分享。
1766
+ 4. 验证:576 项测试通过、1 项原有待办;类型检查、构建和配置检查通过。新增逻辑为合成服务测试,未在两版真实 Host 会话执行系统指令,不据此声称运行验收或发布完成。
1767
+
1768
+ ## 2026-10-16 — 移动端目录缓存
1769
+
1770
+ 1. 安装与主机 API:本轮不改安装范围或依赖;读取沿用现有技能、命令和模型接口。工作区另有 alpha.4 兼容改动,命令对接已重新枚举该版 29 包、144 个接口,相关主机实现与 alpha.3 相同;不据此宣称真实业务验收。
1771
+ 2. 手机协议:模型当前选择投影新增 `s2c.models.changed`,受 `sessions.read` 控制;原生权限执行可附加 `expectedDefinitionId`,重读目录核对来源,旧客户端字段缺省兼容。无新增周期轮询或第二层主机时间缓存。
1772
+ 3. 客户端:内存五分钟、磁盘最长七天,重启旧目录先展示并校验,按配对身份/主机/会话隔离;当前模型、权限和执行结果不落盘。具体约定和格式重建见[移动端目录缓存](移动端目录缓存.md)。
1773
+ 4. 验证:插件 577 项通过、1 项原有待办,类型检查、生成产物构建和使用本机固定版本的离线配置校验通过;两端缓存单元与模拟器证据见各自文档。未发布。