dsh-deeppilot 0.9.1 → 0.9.2

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.
@@ -5,6 +5,52 @@
5
5
 
6
6
  ## Current decision
7
7
 
8
+ - **Audited release:** `dsh-v0.2.1-alpha.1` (official release page:
9
+ <https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.2.1-alpha.1>),
10
+ published 2026-10-03 on the npm `alpha` dist-tag. It is **not** `latest`;
11
+ `latest`/`next` still point at `0.2.0-rc.2`, which is what the current Host runs.
12
+ - **Comparison baseline:** `dsh-v0.2.0-rc.2` (the previous plugin baseline).
13
+ - **Plugin runtime verdict:** **no breaking change in the DSH APIs that DeepPilot
14
+ currently calls.** All 12 peer packages have **zero** changed `src/` files
15
+ between the two tags — each changed only its `package.json` version field and
16
+ its READMEs. See the 2026-10-03 entry below for the full finding-by-finding
17
+ table and for the three official upgrade guides checked against this plugin.
18
+ - **Nothing was changed to support this release.** `package.json`,
19
+ `package-lock.json`, generated `lib/`, `COMPATIBILITY.md`, and `PROTOCOL.md`
20
+ deliberately still describe the `0.2.0-rc.2` baseline. The release-audit-only
21
+ scope was agreed before the audit ran, so no version bump, no dependency
22
+ install, and no `lib/` regeneration was performed.
23
+ - **Peer range still admits it:** `>=0.2.0-rc.2 <0.3.0-0` satisfies
24
+ `0.2.1-alpha.1` under `semver.satisfies(..., { includePrerelease: true })`,
25
+ which is how DSH's `evaluatePluginCompatibility` gates activation. The same
26
+ holds for the `~4.0.4` / `~3.18.4` vendor ranges against `4.0.5-alpha.1` /
27
+ `3.18.5-alpha.1`. Under npm's **default** prerelease handling those three do
28
+ not match, so installing on an alpha host from npm reports peer warnings.
29
+ - **Protocol verdict:** no required DeepPilot phone-protocol break. Protocol v2,
30
+ pairing state, and device records are unchanged; already-paired phones need no
31
+ action.
32
+ - **Release verdict (`0.9.2`, shipped 2026-10-04):** `scripts/smoke-live.mts`
33
+ was run against a live **`dsh-v0.2.1-alpha.1`** web profile and passed with
34
+ **0 failures**. This is the first live-host verification since the 0.9.1
35
+ entry, and it retires the gate that entry left open ("pending separate
36
+ authorization before the `0.9.1` release ships") — on a newer host than the
37
+ rc.2 that entry contemplated, which is strictly stronger evidence: the
38
+ `0.2.1-alpha.1` source-diff above found zero changed `src/` files across all
39
+ 12 peer packages, and the live run agrees. The plugin's own build and type
40
+ baselines stay pinned to `0.2.0-rc.2`; nothing about the pin changed for this
41
+ release.
42
+ - **Two tracked follow-ups:**
43
+ 1. **Schedule documentation is now stale.** Automation tasks became a
44
+ built-in Web capability and `@deepseek-ai/dsh-experimental-schedule-bundle`
45
+ is in DSH's new `RETIRED_BUNDLES` set, so the user instruction "enable
46
+ Automation tasks in the plugin manager" points at a retired bundle.
47
+ Affects `PROTOCOL.md`, `COMPATIBILITY.md`, and the iOS copy. **Open.**
48
+ 2. ~~`subagent_session` is unmapped.~~ **Resolved 2026-10-03:** mapped to
49
+ `E_PROTOCOL` in `src/wire-errors.ts` and added to the frozen expectation in
50
+ `tests/wire-errors.test.ts`. 525 unit tests, typecheck, and build pass.
51
+
52
+ ### Previous decision — `dsh-v0.2.0-rc.2`
53
+
8
54
  - **Audited release:** `dsh-v0.2.0-rc.2` (official release page:
9
55
  <https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.2.0-rc.2>).
10
56
  - **Comparison baseline:** `dsh-v0.2.0-rc.1` (the previous plugin baseline).
@@ -27,6 +73,9 @@
27
73
  against the new range. The one remaining release-only step is a live
28
74
  `scripts/smoke-live.mts` run on a real rc.2 host, pending separate
29
75
  authorization before the `0.9.1` release ships.
76
+ **Closed 2026-10-04:** that gate was discharged by the `0.9.2` live run
77
+ instead — see the release verdict in "Current decision" above. It ran on
78
+ `0.2.1-alpha.1` rather than rc.2, which supersedes this entry's intent.
30
79
  - **Protocol verdict:** no required DeepPilot phone-protocol break. Protocol v2,
31
80
  pairing state, and device records are unchanged; already-paired phones need no
32
81
  action.
@@ -35,6 +84,133 @@
35
84
  bundle" below. The plugin needs no code change; the phone's copy now points
36
85
  at the bundle.
37
86
 
87
+ ## 2026-10-03 — audit of `dsh-v0.2.1-alpha.1`
88
+
89
+ ### Scope and method
90
+
91
+ Compared `dsh-v0.2.0-rc.2...dsh-v0.2.1-alpha.1` (**266 commits, 4190 changed
92
+ files**) from a fresh blobless clone
93
+ (`git clone --filter=blob:none --no-checkout`), unshallowed before measuring.
94
+ Package names were mapped to monorepo paths by reading every `package.json`
95
+ through a sparse checkout, then each package's `src/` was diffed with
96
+ `git diff --name-status`. Baseline SHA `639ed015`, target SHA `5badb150`.
97
+
98
+ ### Peer packages: 12 of 12 have zero changed source
99
+
100
+ Every peer package this plugin declares in `package.json` changed **only** its
101
+ `package.json` and its READMEs. No `src/` file moved:
102
+
103
+ | Package | Path | Version | Changed `src/` files |
104
+ | --- | --- | --- | --- |
105
+ | `@deepseek-ai/dsh` | `apps/cli` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
106
+ | `@deepseek-ai/dsh-api-gateway` | `packages/api/gateway` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
107
+ | `@deepseek-ai/dsh-api-remotes` | `packages/api/remotes` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
108
+ | `@deepseek-ai/dsh-client-connection` | `packages/client/connection` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
109
+ | `@deepseek-ai/dsh-client-locale` | `packages/client/locale` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
110
+ | `@deepseek-ai/dsh-client-ui-settings` | `packages/client/ui-settings` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
111
+ | `@deepseek-ai/dsh-client-ui-slots` | `packages/client/ui-slots` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
112
+ | `@deepseek-ai/dsh-settings` | `packages/settings/settings` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
113
+ | `@deepseek-ai/dsh-typert-protocol` | `packages/typert/protocol` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
114
+ | `@deepseek-ai/dsh-typert-registry` | `packages/typert/registry` | `0.2.0-rc.2` → `0.2.1-alpha.1` | 0 |
115
+ | `@deepseek-ai/cordis` | `vendor/cordis` | `4.0.4` → `4.0.5-alpha.1` | 0 |
116
+ | `@deepseek-ai/schemastery` | `vendor/schemastery` | `3.18.4` → `3.18.5-alpha.1` | 0 |
117
+
118
+ The only non-manifest, non-README change inside a peer package is a **new test
119
+ case** in `packages/api/gateway/tests/gateway.host.spec.ts`, which records a
120
+ behaviour fix: a Service already disposed is skipped during SRC resolution. No
121
+ shipped code changed, so `typertGateway.wireStream.open(endpoint, payload,
122
+ uplink, peer, signal)` keeps its argument order — the seam this plugin's
123
+ highest-risk integration depends on.
124
+
125
+ ### High-risk service surfaces
126
+
127
+ | Area | Finding | DeepPilot impact |
128
+ | --- | --- | --- |
129
+ | `api/session-controller` (`src/index.ts`, `src/list.ts`) | Adds one optional config key `listWorkSliceMs` (natural, min 1, **default 16**) and threads it into `new ApiSessionList(ctx, resolved.listWorkSliceMs)` so large listings yield between rows. No `@Remote` method signature changed. | None. The hand-written `SessionControllerLike` mirror still matches; the plugin never constructs the controller. |
130
+ | `api/workspace-controller` | Zero changed `src/` files. | None. |
131
+ | `schedule/schedule` | `src/tools.ts` and `src/invariant.ts` **deleted**; `ScheduleService.inject` drops `'tools'`; `src/types.ts` gains `SubagentSessionError`. | See the two rows below. |
132
+ | `boot/app-boot` | `createRuntimeResolution` now returns a `ProfileRuntimeResolution` **class instance** instead of a frozen plain object, and a new `RETIRED_BUNDLES` set exists. | None. `app-boot` is not in this plugin's peer set. |
133
+
134
+ ### The three announced breaking changes, checked against this plugin
135
+
136
+ Each was traced to its implementation in the DSH tree rather than accepted from
137
+ the release note.
138
+
139
+ | Breaking change | Where it actually lands | DeepPilot impact |
140
+ | --- | --- | --- |
141
+ | **Runtime invariant plugins and every `./invariant` export removed.** | `@deepseek-ai/dsh-invariants`, `InvariantRegistry`, `InvariantInstaller` and all `<package>/invariant` subpaths stop being published; `sdk-minimal` drops five rows. Official guide: `docs/upgrade-guide/v0.2.0-rc.2/remove-runtime-invariants/`. | **None.** The plugin source contains zero `invariant` references. In `package-lock.json` the package appears only as a transitive dependency of `dsh-credentials`, `dsh-scope`, `dsh-settings` and `dsh-system-prompt` — packages this plugin does not import or configure. `cordis.patch.yml` declares no invariant rows, so no `patch: entry ... not found` warning can occur. |
142
+ | **Subpath plugins no longer read their own `package.json`; text and icon must come from subpath exports.** | `boot/app-boot/src/package-meta.ts`: `manifestPath` is now `packageName === specifier ? optionalResourcePath(...) : undefined`, so only a package-root specifier reads a manifest; a subpath instead takes its icon from an exported `<specifier>/icon`. A new `assertPackageOwned` keeps an exported icon inside its owning package. Official guide: `docs/upgrade-guide/v0.2.0-rc.2/subpath-plugin-display-manifest/`, which states the affected group is "authors who export a subpath `package.json`". | **None.** `package.json` exports `./package.json` (package root) but **not** `./client/package.json`, and the root manifest still supplies `name`, `description` and `icon.svg`. Verified against Node's real exports gate in this repo: `dsh-deeppilot/client/package.json`, `dsh-deeppilot/client/icon` and `dsh-deeppilot/client/locale/en.json` all fail with `ERR_PACKAGE_PATH_NOT_EXPORTED` **today**, so the old code could never have resolved them either. Old and new resolution therefore produce the same result. |
143
+ | **Composer statistics split into `activity` and `usage` entries; plugins overriding the old `stats` row must change their registered ID.** | The `stats` composer row was reworked (the `composer-session-stats-pills` design note is archived). | **None.** The plugin registers exactly one client extension — `slots.inject('settings.section', ...)` in `src/client/index.ts:478` — and never registers a composer row. The `row.stats` at `src/host-bridge.ts:663` is this plugin's own wire structure, unrelated to the composer extension. |
144
+
145
+ ### Automation tasks moved into the Web composition
146
+
147
+ This is the one substantive product change, and it invalidates documentation
148
+ rather than code.
149
+
150
+ `boot/app-boot/src/profile.ts` adds:
151
+
152
+ ```ts
153
+ const RETIRED_BUNDLES: ReadonlySet<string> = new Set([
154
+ '@deepseek-ai/dsh-experimental-schedule-bundle',
155
+ ])
156
+ ```
157
+
158
+ and removes that bundle from `OPTIONAL_BUNDLES` (replaced by
159
+ `@deepseek-ai/dsh-experimental-inspector-profile`). `loadProfileDirectory`
160
+ rewrites the profile's `package.json` to drop the retired entry; stored tasks and
161
+ delivery records survive on disk. The official guide
162
+ (`docs/upgrade-guide/v0.2.0-rc.2/schedule-bundle-retired/`) states that
163
+ `@deepseek-ai/dsh-web-app` now mounts `schedule` and `ui-schedule` in **every**
164
+ Web profile.
165
+
166
+ The plugin needs no code change. It resolves the service lazily through
167
+ `ctx.get('schedule')` (the fix recorded in the 2026-09-29 entry), never lists
168
+ `schedule` in `inject`, and already reports `E_UNSUPPORTED` when the service is
169
+ absent. On a `0.2.1-alpha.1` Web profile the service is simply always present,
170
+ so `welcome.capabilities.schedules` becomes `true` by default instead of by
171
+ opt-in.
172
+
173
+ What is now wrong is the instruction the plugin gives users. `PROTOCOL.md`
174
+ (line 899), `COMPATIBILITY.md` (lines 39–47), `docs/RELEASE_NOTES-0.9.0.md`, and
175
+ `docs/DEEPPILOT_FEATURE_PLAN.md` all tell the user to enable **Automation tasks**
176
+ in the plugin manager, and the iOS copy repeats it. On this release that entry is
177
+ retired and auto-cleaned, so the instruction sends users after a bundle that no
178
+ longer exists.
179
+
180
+ The upgrade guide's migration step 2 — keep `schedule`/`ui-schedule` overrides in
181
+ a patch layer and delete a top-level `time-context` override — **does not apply
182
+ here**: `cordis.patch.yml` is 20 lines long and contains only the three
183
+ directory-picker rows, with no `schedule`, `ui-schedule` or `time-context`
184
+ entries.
185
+
186
+ ### New Schedule refusal: `subagent_session`
187
+
188
+ `ScheduleService` now refuses `create` and `update` when the target Session has
189
+ a delegation depth above zero, returning a new stable `ScheduleInputError`
190
+ code `subagent_session` ("This Session belongs to subagent routing, which never
191
+ receives reminder delivery"). `delete` deliberately still works so tasks stored
192
+ before the rule existed stay removable. The refusal is also visible to subagents
193
+ because the bridge reaches this code through the same `@Remote` methods.
194
+
195
+ `src/wire-errors.ts` now maps twelve Schedule codes, adding `subagent_session` →
196
+ `E_PROTOCOL` alongside `schedule_not_found`, `invalid_selector`, `not_future`,
197
+ `frequency_too_high`, `schedule_ended` and the rest. It was chosen over
198
+ `E_UNSUPPORTED` because the capability exists on the host — it is this request's
199
+ target that can never be satisfied, so a phone retry is pointless — which puts it
200
+ in the same class as the other input-shaped Schedule refusals. Without the
201
+ mapping `wireErrorOf` falls through to `WIRE_ERROR_FALLBACK` (`E_INTERNAL`), which
202
+ would tell the client the failure was worth retrying.
203
+
204
+ ### Re-audit procedure used
205
+
206
+ Same blobless-clone method as the rc.2 and rc.1 entries, with two refinements:
207
+ unshallow before measuring (a `--depth=1` clone silently under-reports the diff,
208
+ returning 4190 vs 4760 paths depending on history), and resolve peer package
209
+ names through a sparse `package.json` checkout instead of guessing directory
210
+ names — the monorepo maps `@deepseek-ai/dsh-api-gateway` to
211
+ `packages/api/gateway`, `@deepseek-ai/dsh` to `apps/cli`, and the two vendored
212
+ packages to `vendor/`.
213
+
38
214
  ## 2026-09-29 — audit of `dsh-v0.2.0-rc.2`
39
215
 
40
216
  ### Scope and method