Skip to content

Releases: SeasonTemple/dsh-decision-gate

v0.5.1 - The parity replay runs again, and the desktop RC compatibility is declared

Choose a tag to compare

@github-actions github-actions released this 19 Oct 05:33

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 一直是红的。 红着的检查比没有检查更糟:它让"测试全绿才算完成"(AGENT.md 第 20 条)变成空话。现在四个离线段全部跑完:30 例豁免解析 + 3 条降级规则、5 条授权决策规则 + 3 条匹配规则、12 例裁判输出解析、11 种配置形状。
支持范围声明在 harness 真正读的地方 package.json 新增 engines.dsh: ">=0.2.0-rc.1 <0.3.0-0"。桌面 RC 的加载器(dsh-app-boot 的 evaluatePluginCompatibility)只读 bundle 的 package.json——有 engines.dsh 就只认它,否则逐个校验 @deepseek-ai/dsh* peer 范围对运行时版本。 之前范围只写在 dsh.plugin.json 里,而 RC 的代码根本不读这个文件——版本不符时 harness 不会跳过 bundle,而是带病加载。现在不符的 DSH 会被显式跳过并报出名字。dsh.plugin.json 保留同范围给仍读它的旧版。
取消不再等裁判 门禁是异步的 tools/pre-execute 监听器,RC 契约要求异步门观察 exec.signal;此前裁判调用只听自己的 60s 预算,用户取消后要白等整个裁判。现在两个裁判后端都优先响应调用方取消,预算第二。 取消一个卡住的门禁调用,以前最多白等 60 秒;现在即时返回。没有 signal 的执行(旧 RC、功能测试的假 exec)行为不变。
README 开头有版本适配说明了 双语 README 在开头段落之后新增一段:对桌面 RC 0.2.1-rc.2 逐项验证过的结论——活门禁挂在 tools/pre-execute 接缝、支持范围声明位置、hooks.json 形态需要可选的 claude-code 桥接插件。 0.2.1-rc.2 桌面包里没有打包 @deepseek-ai/dsh-hooks-claude-code(295 个包里零个 hooks 包)。活门禁从来不用 hook 形态,所以没有回归——但 0.2.0-rc.2 的可移植性结论描述的是那个构建,不是这个。

Compatibility

Surface Before After Action
package.json engines.dsh 不存在;RC 加载器不读 dsh.plugin.json >=0.2.0-rc.1 <0.3.0-0,加载器亲自执行 无需操作
取消受管调用 等裁判落地(最长 60s)后才应用取消 调用方取消立即中止裁判调用 无需操作
src/host.d.ts 环境类型 停留在 RC 之前的声明 对齐 0.2.1-rc.2(cancel、deny.reason 必填、ask.displayReason、exec.signal、tool-calls finish) 无需操作(仅编译期)
hooks.json 形态 0.2.0-rc.2 桌面包内有桥接插件 0.2.1-rc.2 桌面包不打包该桥接 只用进程内门禁则无需操作;要用 hook 形态就从插件市场安装桥接

Verification

  • node tests/functional.mjs:22 个用例,0 failures(双后端、fail-open、日志、授权规则)
  • node src/parity.ts:豁免 30+3、授权 5+3、裁判解析 3+9、配置形状 8+3,全部 0 failures;录制基线实跑需要 TypeSafe 密钥,本机出口被区域封锁(HTTP 451),实跑段无法在此验证——CI 覆盖
  • python -m pytest tests/test_decision_gate.py tests/test_exempt.py tests/test_analyze.py -q:127 passed
  • tsc -p tsconfig.json 与 --noEmit:零错误;lib/ 已重建并与源码一致(CI 有产物新鲜度门)
  • RC 适配结论来自直读桌面 RC asar 内的包源码:dsh-tools 的 tools/pre-execute 派发、dsh-plugin-manager/dsh-app-boot 的 bundle 与兼容门、dsh-llm 的 llm.stream 与 EpochHeader.config、SessionHeader.cwd、设置卡片各接缝

Notes

  • 仍未验证:0.2.1-rc.2 下的 hooks 桥接(未打包,需市场安装后才能验);TypeSafe 录制基线实跑(本机 451)
  • 本机验证时 Node 24.21.0 / Electron 44.7.0(RC 运行时);CI 覆盖 Node 20/22、Python 3.9/3.12

English

Highlights

Area Change Why it matters
The parity replay runs again 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.json engines.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

Verification

  • node tests/functional.mjs: 22 cases, 0 failures (both backends, fail-open, log, authorization rules)
  • 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
  • python -m pytest tests/test_decision_gate.py tests/test_exempt.py tests/test_analyze.py -q: 127 passed
  • 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

v0.5.0 - The settings card finally renders

Choose a tag to compare

@github-actions github-actions released this 10 Oct 10:14

v0.5.0 - The settings card finally renders

2026-10-10 - The card 0.4.0 documented and did not deliver now works, and every
failure path that used to be silent is now visible.

中文

Highlights

维度 改动 为什么重要
设置卡片可用了 插件页 bundle 详情里,描述和组件列表之间,现在会出现配置表单:裁判后端、provider/model、matcher、日志路径、五个阈值、豁免前缀、预授权操作全部可编辑,写入即时生效,不用重启、不用手改 YAML。 0.4.0 的文档承诺了这张卡片,但它根本不出现——三条失败路径全是静默的,用户看到的是"什么都没有"。
authorizedOperations 生产验证通过 预授权的不可逆操作(如 git push origin main)现在真的免询问,日志记 authorized_external + authorized: true。 0.4.0 发布时这个功能是空头承诺:配置读不出来、匹配不上、剥离不开,三处都测试全绿但生产不生效。
失败不再静默 require 失败会注册一个写着原因的占位卡片;服务未注入会直接报错;remote.session 未注入时的属性访问崩溃也有了明确报错。 0.4.0 之所以能带着一个不存在的设置页发布,就是因为失败只留一句 console.error。

Compatibility

Surface Before After Action
插件页 bundle 详情只有描述和组件列表 描述和组件列表之间多出配置表单 无需操作
cordis.patch.yml 唯一的配置通道 仍然是有效通道,与卡片等价 无需操作;两种方式写同一处
客户端 inject [](却使用三个服务) ['slots', 'configForms', 'remote', 'remote.session'] 无需操作
配置键 13 个 13 个,无增删 无需操作

Verification

  • node tests/functional.mjs → 0 failures(22 项,含 4 项授权用例)
  • python -m pytest tests/test_decision_gate.py tests/test_exempt.py tests/test_analyze.py -q → 127 passed
  • npx tsc -p tsconfig.json → 0 errors
  • CI:Node 20/22 × Python 3.9/3.12 四矩阵全绿
  • 手动:桌面应用重启后插件页出现配置表单;git push origin main 日志为 allow / authorized_external / authorized=True

Notes

  • hooks/hooks.json 的可移植性已验证(2026-10-12):直接读 DSH 0.2.0-rc.2 自带的 hook 运行器确认,不需要第二台机器——命令 hook 以会话工作区为 cwd 执行,python hooks/decision_gate.py 的解析与 0.4.0 当时的判断一致。同时补上当时没写的两个边界:桥接配置是进程级全场;hook 跑不起来只记日志、agent 继续。该文件在“会话工作区 = 本仓库”时正确,其他工作区静默失效。完整契约见 setup 文档。
  • 版本仍是 0.x:1.x 曾经冒进发布过一次(2026-09-22 的 1.0.0),在设置卡片不存在、预授权不生效的情况下。0.5.0 的意思是"门禁本身可用、配置界面也可用,但并非全部路径都验证过"。
  • 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 a configuration form appears between them none
cordis.patch.yml the only configuration channel still a valid channel, equivalent to the card none; both write the same place
client inject [] while using three services ['slots', 'configForms', 'remote', 'remote.session'] none
Config keys 13 13, none added or removed none

Verification

  • node tests/functional.mjs → 0 failures (22 cases, 4 of them authorization)
  • python -m pytest tests/test_decision_gate.py tests/test_exempt.py tests/test_analyze.py -q → 127 passed
  • npx tsc -p tsconfig.json → 0 errors
  • 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.

v0.4.0

Choose a tag to compare

@github-actions github-actions released this 10 Oct 07:15

Full Changelog: v1.4.0...v0.4.0