DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Harness Audit — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins

dsh-harness-audit

Harness Audit

根据 harness-evaluation 标准审核智能体工具框架,并通过机器强制执行证据验证。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add dsh-harness-audit@0.1.0
README兼容性版本

兼容性与来源证明

Harness Audit 以 dsh-harness-audit 发布,当前版本为 0.1.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
any
发布来源
npm
Registry 更新时间
2026/9/20

版本

0.1.0stable
2026/8/17

相关插件

正在加载相关插件…

最新版
0.1.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
95 kB
文件数
5
Surface
any
许可证
MIT
发布源
npm
GitHub
★ 1
周下载
97
最近提交
2026/8/17
查看源码 ↗项目主页 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 agents-orchestration 分类下经过校验的插件。

Headless@deepseek-ai/dsh-headlessdsh one-shot bundle:基于 dsh-base 的直接核心 Agent/Session 运行器,不包含 Host、HTTP 或浏览器层Experimental Agent Team Web Profile@deepseek-ai/dsh-experimental-agent-team-web-profile用于 Agent Teams Remote 和 UI 插件的实验性 Web 配置层Subagent Codex@deepseek-ai/dsh-subagent-codex基于官方 app-server 协议的一次性 Codex 子代理提供程序Subagent Claude Code@deepseek-ai/dsh-subagent-claude-code基于官方 Agent SDK 的一次性 Claude Code 子代理提供方

README

dsh-harness-audit

Audits an agent harness for the failure modes that break agent loops — and refuses any finding whose evidence isn't actually in the code.

Fifteen checks, one throwaway subagent each, and a summary written by code rather than by a model. The plugin is self-contained: installing it installs the criteria too.

What it actually catches

The criteria are failure modes, not style. A sample:

C1A tool call gets no result, so the next request carries a call with no answer and the model service refuses it.
C9An operation times out after its external effect landed, so the retry does it twice — two messages sent, two charges.
C10The user cancels; the subprocess keeps running and the request is still in flight.
C12The model calls the same tool forever, with no cap on rounds or spend.
C14The start of each request keeps changing, so the provider's prefix cache never hits. Nothing errors — it just costs more, every request.

The full set spans state consistency, untrusted input, failure handling, cancellation boundaries, resource limits, and observability.

Use

/harness-audit          # asks which dimensions, with a plain-language menu
/harness-audit C1       # one dimension
/harness-audit C1,C9    # several
/harness-audit p1       # the seven critical ones
/harness-audit all      # all fifteen

The command returns immediately and the audit runs as a background job, so it does not block the session. When it finishes, the agent is woken and reports. Ask for progress at any time with job_output <id>.

Two files land in outputDir (default .harness-audit/), named by local time and the dimensions covered:

report-2026-08-17_095736-C1.md
report-2026-08-17_095736-C1.json

Input that cannot be parsed is refused, never silently reinterpreted — an earlier version accepted only --checks, so --check c2 fell through to a configured default and audited a different dimension without saying so.

Does it work?

Measured against a fixture with known defects — seven deliberate C1 bugs, one config-gated case, and one deliberately correct module as a false-positive probe:

Defects found8 of 8
False positives0 — the correct module was never flagged
Evidence rejections2 of 10 submissions, both corrected on resubmission
Cost205s, 61K in / 24K out for one dimension

The one verdict that differed from the fixture's answer key was the auditor being more right than the sheet: it read the default of the environment variable gating the path and judged it reachable.

npm test --prefix dsh-harness-audit

191 tests. The load-bearing ones assert that every check carries criteria a subagent can judge by, that a check prompt carries only its own criteria, and that no prompt has drifted back to asking for a document that is not installed.

How a run works

  1. Recon — one subagent locates landmarks (agent loop, request assembly, tool execution, …) and reports them through report_landmark.
  2. Fan-out — one throwaway subagent per check, each given exactly one check's criteria and only the landmarks that check depends on. A check whose required landmark was not found is not dispatched; it is recorded as not covered. Running a check with no target is a leading source of false positives.
  3. Summary — pure code. No model writes it: that is how suspected turns into confirmed and how unevidenced claims get in.

Evidence validation

report_finding refuses a submission unless:

  1. the check belongs to this run,
  2. the path is first-party code — not .venv, site-packages, node_modules, …,
  3. the file exists inside the workspace (also the path-traversal gate),
  4. the line exists in that file,
  5. the quoted evidence actually appears within ±3 lines of the cited line, and
  6. a suspected verdict carries a confirmHint.

Rule 5 compares normalised text — trimmed, internal whitespace collapsed — not bytes, so indentation differences don't cause spurious refusals. A refusal is returned to the subagent with the reason, and in practice it re-reads the file and resubmits correctly.

The rejection rate is the metric to watch. Every report states it. A high rate means the subagents are fabricating and the prompts need work. It is never a reason to relax validation.

Scope enforcement exists for the same reason. A first run against a Python project located all 23 landmarks inside .venv/site-packages/, auditing the vendored framework rather than the project. Asking was not enough; the tools now refuse those paths, and the same run costs 147s instead of 698s.

Install

dsh plugin --profile web add dsh-harness-audit

Distribution is via npm or pnpm pack. A GitHub install works too, but pulls source rather than build output: pnpm must run this package's prepare script, which the user has to authorise in their profile's pnpm-workspace.yaml. That authorisation lets this package's code run on their machine outside any agent sandbox, so pin the commit:

dsh plugin --profile web add github:you/repo#<commit-sha>

Without the sha the install resolves to whatever the default branch points at at install time, so two people running the same command on different days get different code. The prebuilt paths avoid the question entirely.

Development

pnpm dsh --profile web --patch ./dsh-harness-audit/cordis.yml

Four things that cost time when they are wrong:

  • web is an alias for --profile web and rejects --patch alongside it. Use --profile web.
  • The name in cordis.yml must be an installed package name or an absolute file:// URL. Node's ESM loader accepts only file:, data: and node: schemes — a bare F:/… fails with Received protocol 'f:', and a git URL cannot work here at all. Git URLs belong in dsh plugin add, not in a patch row.
  • Running dsh from a source checkout requires that checkout to be built (npm run build:lib:host at minimum), or the boot fails in typert-loader before any plugin loads. A built install — what real users have — is fine.
  • pnpm install here needs --ignore-workspace when the package sits inside another pnpm workspace's tree; without it pnpm installs the outer workspace and ignores this package entirely.

Configuration

FieldDefaultMeaning
checks[]Check ids to run. Empty means "ask", never "audit everything".
priorityFloor2Run checks at or below this priority (1 = P1 only). An explicitly named check runs regardless.
concurrency3Checks in flight at once. 1 is supported and is the cheapest way to debug.
subagentProviderspawnSubagent provider name.
maxTokensPerCheck120000Advisory. See the limitations below.
outputDir.harness-auditWorkspace-relative report directory.
announceOnStarttruePost a one-line notice when a run starts, so a fresh session has something to attach the job UI to.
backgroundtrueRun as a job. false blocks the command until the audit finishes.
useLsptrueTry LSP navigation, degrading to text search.
crossCheckAnalysisfalseReserved; not yet emitted.
languageautoOutput language. auto follows the harness locale, then the host locale, then English.
excludePathsdependency dirsDirectory names refused as out of scope. [] audits a vendored framework deliberately.

Known limitations

  • maxTokensPerCheck is advisory. The subagent seam has no whole-run token cap — AgentOptions.maxTokens bounds a single response, not a run — so the budget is stated to the subagent and recorded, and the report gives the observed cost. It is not enforced.
  • crossCheckAnalysis is not implemented. When built, its output must be a separate section marked as model inference that did not pass validation.
  • LSP availability is per-extension. The seam exposes no capability query, so availability is observed by running a query and routing on the thrown LspError. The probe runs after recon, using the detected primary language, and speaks only for that language.
  • Token attribution needs a local subagent provider. Cost is folded from the child's session events; a remote provider publishes no local child session, so its usage reads as zero.
  • A run in a brand-new session shows nothing until the first turn. Command dispatch produces no turn, and the conversation's UI slots are session-scoped, so the job indicator has nowhere to attach until something else starts one. announceOnStart exists to start one.

Design notes

The criteria live in src/criteria.ts, not in a skill. An earlier version shipped a bundled harness-evaluation skill that subagents loaded at run time. That indirection is gone so that installing the plugin installs everything. The trade is recorded in that file's header: changing a criterion is now a code change and a release, and a project can no longer override the criteria by shipping its own skill of the same name.

Each check's criteria are handed to its subagent verbatim, and only its own. The plugin's name, group and picker glosses are navigation copy; no subagent is shown them, and they must never stand in for the criteria.

Audit children are not tool-scoped. An earlier version passed toolFilter: { allow: [...] }, built from names resolved in the plugin's own scope. Model-facing tools live on the agent plane, so the list collapsed to one entry and tools.restrict() removed everything else — recon came back with unknown tool "read". There is no supported way to enumerate a child's scope before it exists, and guessing is worse than not scoping.