You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
v0.5.1 - The parity replay runs again, and the desktop RC compatibility is declared
2026-10-19 - npm run check is green again (the parity replay had been
crashing since 1.4.0), and the supported DSH range now lives where the
harness's own loader reads it.
中文
Highlights
维度
改动
为什么重要
parity 回归脚本修好了
src/parity.ts 的 import 补上了 isAuthorizedMatch。自 1.4.0 线引入语句级预授权匹配(0f8f1eb)以来,这个脚本一跑到授权段就 ReferenceError 崩溃——npm run test:node 和 npm run check 一直是红的。
src/parity.ts imports isAuthorizedMatch. Since the statement-level pre-authorization fix (0f8f1eb, in the 1.4.0 line), the script crashed with ReferenceError the moment the exemption section handed off to the authorization section — npm run test:node and npm run check have been red ever since.
A red check is worse than no check: it made "tests green or it is not done" (AGENT.md rule 20) an empty rule. All four offline sections now run: 30 exemption parser cases + 3 downgrade rules, 5 authorization decision rules + 3 match rules, 12 judge-output parses, 11 config shapes.
The supported range is declared where the harness reads it
package.json gains engines.dsh: ">=0.2.0-rc.1 <0.3.0-0". The desktop RC loader (evaluatePluginCompatibility in @deepseek-ai/dsh-app-boot) reads only the bundle's package.json — an own engines.dsh decides alone, otherwise every @deepseek-ai/dsh* peer range is checked against the runtime.
The range previously lived only in dsh.plugin.json, a file no RC code reads — an incompatible DSH loaded the bundle instead of skipping it. Now the loader itself enforces the range and skips loudly. dsh.plugin.json keeps the same range for older harnesses.
Cancellation no longer waits out the judge
The gate is an async tools/pre-execute listener and the RC contract asks async gates to observe exec.signal; the judge call previously watched only its own 60s budget, so a cancelled call sat out the full judge. Both backends now abort on caller cancellation first, budget second.
Cancelling a stuck gated call used to block for up to 60s; it now returns immediately. Executions without a signal (older RC, the functional tests' fake exec) behave exactly as before.
Both READMEs open with a version-compatibility note
A new paragraph after the intro records what was verified against desktop RC 0.2.1-rc.2: the live gate rides the tools/pre-execute seam, where the range is declared, and that the hooks.json form needs the optional claude-code bridge.
@deepseek-ai/dsh-hooks-claude-code is not bundled in the 0.2.1-rc.2 desktop build (zero hooks packages among the shipped 295). The live gate never used the hook form, so nothing regresses — but the 0.2.0-rc.2 portability conclusion describes that build, not this one.
Compatibility
Surface
Before
After
Action
package.jsonengines.dsh
absent; the RC loader never read dsh.plugin.json
>=0.2.0-rc.1 <0.3.0-0, enforced by the loader
none
Cancelling a gated call
waited for the judge (up to 60s) before cancellation applied
aborts the judge call immediately
none
src/host.d.ts ambient types
predated the RC
refreshed against 0.2.1-rc.2 (cancel, required deny.reason, ask.displayReason, exec.signal, tool-calls finish)
none (compile-time only)
hooks.json form
bridge present in the 0.2.0-rc.2 desktop build
not bundled in 0.2.1-rc.2
none for the in-process gate; market-install the bridge to use that form
node src/parity.ts: exemption 30+3, authorization 5+3, judge-parse 3+9, config-schema 8+3 — all 0 failures; the recorded-baseline replay needs a TypeSafe key and this machine's egress is region-blocked (HTTP 451), so that section could not run here — CI covers it
tsc -p tsconfig.json and --noEmit: zero errors; lib/ rebuilt and committed fresh (CI gates artifact staleness)
The RC conclusions come from reading the shipped package sources inside the desktop RC archive: the tools/pre-execute dispatch in dsh-tools, the bundle and compatibility gates in dsh-plugin-manager / dsh-app-boot, llm.stream and EpochHeader.config in dsh-llm, SessionHeader.cwd, and every settings-card seam
Notes
Still unverified: the hooks bridge under 0.2.1-rc.2 (not bundled — needs a market install first); the TypeSafe recorded-baseline replay (HTTP 451 from this machine)
Local verification ran on Node 24.21.0 / Electron 44.7.0 (the RC runtime); CI covers Node 20/22 and Python 3.9/3.12
v1.4.0 的 tag 和 Release 已删除;重置的事实记录在 CHANGELOG 的 0.4.0 条目里。
English
Highlights
Area
Change
Why it matters
The settings card works
A configuration form now appears on the Plugins page's bundle detail, between the description and the component list: judge backend, provider/model, matcher, log path, all five thresholds, exempt prefixes, and the pre-authorized operations are editable, and a write applies without a restart or a YAML edit.
0.4.0 documented this card and shipped without it. All three failure paths were silent, so what a user saw was nothing at all.
authorizedOperations verified in production
A pre-authorized irreversible step such as git push origin main genuinely stops asking; the log records authorized_external with authorized: true.
At 0.4.0 this was a promise with nothing behind it: the config read as empty, the match never fired, and the stripping was wrong — three bugs every test passed.
Failure is no longer silent
A failed require registers a placeholder card naming the reason; a missing service errors loudly; the remote.session crash has an explicit message.
0.4.0 could ship a settings page that did not exist precisely because failure left one console.error.
Compatibility
Surface
Before
After
Action
Plugins page
bundle detail showed only a description and a component list
CI: Node 20/22 × Python 3.9/3.12, all four matrix legs green
By hand: after a desktop restart the Plugins page shows the form; git push origin main logs allow / authorized_external / authorized=True
Notes
hooks/hooks.json portability is verified (2026-10-12). The hook runner shipped inside DSH 0.2.0-rc.2 settles it without a second machine: command hooks run with the cwd of the agent session's workspace, so the repo-relative python hooks/decision_gate.py resolves as the 0.4.0 entry assumed. Two boundaries that note never stated are recorded now: the bridge config is process-wide, and a hook that cannot run is logged and skipped while the agent continues. The file is correct for sessions whose workspace is this repo, and silently no-ops in any other workspace. The setup doc records the full contract.
The version is still 0.x. 1.x was claimed once before (1.0.0 on 2026-09-22) while the settings card did not exist and pre-authorization did not work. 0.5.0 means "the gate works and the configuration surface works, but not every path is verified".
The v1.4.0 tag and Release are gone; the reset is recorded in the 0.4.0 changelog entry.