DeepSeek Harness 插件

EvilIrving/dsh-proof

Star 数 ★ 1 分类 工作流与自动化 收录于 2026-08-14

独立只读验收层:顶层 turn 收尾前 spawn 只读 verifier,未通过时把缺口注回主 agent。

安装

# GitHub 源码(首次需按提示配置 allowBuilds 构建授权后重试)

dsh plugin --profile web add github:EvilIrving/dsh-proof

装任何插件都等于在你的机器上跑第三方代码,权限和你本人一样大——能读你的文件、用你的凭据、访问网络,工具审批管不到它。GitHub 来源的插件还会在安装时执行构建脚本——pnpm 默认拦截,所以安装可能停在 ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED 或 ERR_PNPM_IGNORED_BUILDS;dsh 会打印出需要添加的确切键名,把它加进该 profile 的 pnpm-workspace.yaml 的 allowBuilds 下,重跑一次即可装上。放行构建本身就是一次信任判断:请只安装可信来源,并尽量锁定 commit(github:owner/repo#sha)。

README

该插件的 README 只有英文版本。

Independent read-only acceptance layer for the DeepSeek Harness.

Before each top-level turn closes, dsh-proof spawns a read-only verifier subagent, collects its structured verdict, and steers any non-pass gaps back into the driving agent. It is the harness's missing "is the agent actually done" gate — no other plugin can substitute for it.

Install

dsh plugin --profile <name> add github:EvilIrving/dsh-proof

Or, from a checkout:

dsh plugin --profile <name> add ./dsh-proof

The bundle patch inserts one plugin row (dsh-proof); it needs the subagents service (the official dsh-subagent providers), which the base profile already mounts.

How it works

Step Mechanism
Intercept "about to close" agent/turn-stopping (serial, awaited before the turn commits)
Spawn a read-only verifier ctx.subagents.start('spawn', …) with toolFilter.deny + outputSchema
Block recursion delegationDepthOf(agent) > 0 filter + maxDepth: 0
Steer gaps back agent.inject(gap details) + agent.steer(followup) on fail / insufficient-evidence

The verifier inherits the parent's tool set and is narrowed by the deny list (see deny list); it never sees a whitelist that could accidentally hide a newly added read-only tool. A verifier that ends with stopReason !== 'completed' or a missing structured result is treated as "no objection", so a failed proof never fails the user's turn.

Config

export interface Config {
  providerName: string          // default 'spawn'
  maxAttemptsPerTurn: number    // default 3
  denyTools: string[]           // default mutating-tool deny list
  verifierPrompt: string        // read-only acceptance instruction
  followupInstruction: string   // steering text after a failed verdict
}

Set any field from cordis.yml:

plugins:
  dsh-proof:
    config:
      maxAttemptsPerTurn: 2
      denyTools: [write, edit, str_replace_editor, bash, run_code, subagent]

Deny list

toolFilter.deny removes tools from the verifier's inherited full set. tools.restrict validates every name loudly, so denyTools must name tools the deployment actually registers. The default is write, edit, str_replace_editor, bash, run_code, subagent, which keeps read-only discovery tools (read, read_image, glob, grep) available. A deployment that adds its own mutating tools must extend the list; a deployment that forbids even shell/read access should switch to an explicit allow whitelist (set denyTools and verifierPrompt to match, or extend the plugin for an allowTools field).

Model Experience

Request context and condition

What the model sees

The top-level agent receives an injected user message listing the verifier's gaps and evidence, followed by the configured followupInstruction. Only a non-pass verdict injects anything; a passing turn adds nothing.

Token effect

Zero-direct effect on passing turns. A failing turn adds one bounded injected message (gaps + evidence) plus the short follow-up line.

KV Cache effect

Append-only: the injected context and follow-up are appended as new user messages, never rewriting earlier request tokens.

Known Limitations and Deferred Work

  • Deny list must match the deployment's tools — tools.restrict fails loud on unknown names, so a mismatched default blocks verifier startup. The exact mutating-tool set is deployment-specific and is resolved at first install.
  • No evidence normalization — the verifier gathers evidence itself; this plugin does not re-implement diff/test/typecheck/lint. A deployment wanting specific evidence channels should extend verifierPrompt.
  • Best-effort spawn — a provider that is absent or rejects the request degrades to a no-op (logged), rather than failing the user's turn.

内容来自项目 README(GitHub)↗

链接

同类插件

查看整个分类 →

社区评论

评论公开保存在 GitHub Discussions。加载评论会连接 GitHub 和 Giscus;发表内容需要 GitHub 账号。