DeepSeek Harness Hub
← 返回列表

AI 审批代理PerryLink/dsh-auto-review

DeepSeek Harnessspec-screened需联网code在 GitHub 查看 ↗
✓ 可直接安装

🤖 dsh-auto-review

自动检查通过:npm 包已发布且 engines 声明满足基线(声明 Node ^22.19.0 || >=24.0.0);该结论来自程序自动检查,未经人工实机验证。 · 最近上游提交 2026/9/19 · 已提供中文文档

针对 DeepSeek Harness 审批请求的第二模型 AI 自动审查:一个只读的审查者子代理返回结构化的允许/拒绝裁决及理由,默认故障关闭,可从会话日志中完整审计(approval/asked -> autoReview/verdict -> approval/decided)。

综合分
61.6
GitHub 分
61.6
用户评分
★ Stars
182
周下载量
811
安装插件(需先安装 dsh CLI 引擎:npm install -g @deepseek-ai/dsh)
dsh plugin --profile web add dsh-auto-review
npm 包 dsh-auto-review 已校验归属本仓库,走 npm 安装最省事
⚠︎ 实装验证未通过(dependency_conflict · 2026/9/18) ——可能是 CI 环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
数据截至 2026/9/19(元数据每日更新 · 实装验证按队列轮转,单条结论的验证时间见上方)
安装兼容性检查✓ 自动检查通过

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

npm 包dsh-auto-review @ 0.12.4
Node 引擎要求 ^22.19.0 || >=24.0.0 · 基线 Node 22.19 满足
dsh CLI 依赖未声明 dsh 版本约束
入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后验证 2026/9/17 04:55:53

⚠ 该插件运行需访问外部网络 / 远程 API,部署在国内无外网环境时可能无法正常使用。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh-app-boot@deepseek-ai/dsh-credentials-local@deepseek-ai/dsh-fs-observation-policy@deepseek-ai/dsh-fs-sandbox@deepseek-ai/dsh-home-paths@deepseek-ai/dsh-llm-deepseek@deepseek-ai/dsh-sandbox-local@deepseek-ai/dsh-sandbox-policy@deepseek-ai/dsh-session-persistence-jsonl@deepseek-ai/dsh-settings-file@deepseek-ai/dsh-subagent-fork-in-process@deepseek-ai/dsh-subagent-spawn-in-process
用户评分
还没有人投票,来当第一个
订阅周报,不错过优质插件更新
每周一封 · 高评分插件 + 新用户活动

README

🤖 dsh-auto-review
Gitee

为 DeepSeek Harness 提供第二模型 AI 审批——一个只读的审查子代理在审批链上决定允许/拒绝,默认失败即拒绝。

当某个操作跨越沙箱边界时,第二个模型会阅读证据并返回带有理由的裁决——因此人类无需批准任何操作,同时也不会让任何不安全的行为溜过。

官方仓库。 这是 dsh-auto-review 唯一的官方仓库,由 PerryLink 维护。其他账号下的同名仓库均与本项目无关。

License
DSH plugin
dsh-doctor
Node
CI
Version
npm version
npm downloads

English · 简体中文 · Español · Português · हिन्दी

兼容性

| 层面 | 状态 |
|---|---|
| Harness | DeepSeek Harness dsh-v0.1.6-alpha.2(已于 2026-09-18 验证)。支持双线 npm:开发固定版本与运行时依赖 0.1.5-rc.2,peer 依赖 >=0.1.2-rc.1 =0.1.5-alpha.1 =0.1.6-0 =24.0.0 |
| 平台 | 全部(宿主应答器;可选的 Web 审查面板通过会话投影能力提供) |
| 模型 | 任意(审查器继承会话代理的路由;reviewerModel 可覆盖) |

你将获得

dsh-auto-review 在 approval/request 应答器链上放置了第二个模型:

1. 官方接缝——一个应答器,仅认领它自己拥有的请求(ai 策略),并通过 next() 委托其他所有请求;人类审批流程绝不会被短路。
2. 只读审查者子代理——一个一次性 fork,带有 read/glob/grep 工具允许列表,返回结构化裁决 { decision, reason, riskLevel }。审查者请求通过身份识别并被委托;maxDepth + 允许列表使审查者无法继续委托。
3. 故障关闭——审查者崩溃、超时或 schema 不匹配时通过 fallbackPolicy(默认 rejected)解决;拒绝裁决会将其原因反馈给调用模型。
4. 配置驱动路由——按工具的策略(ai/human/never)加上正则风险规则,全部可从 cordis.yml 更改。
5. 拒绝原因送达模型——审查者的原因被注入到被拒绝的工具结果中(与 callId 关联);回退和 never 策略拒绝也会注入可审计标记([auto-review] / [auto-review-fallback] / [auto-review-never])。
6. 完整审计追踪——仅记录的 autoReview/verdict + autoReview/rejection 会话事件(信封 ignorable: true)加上一个可选的不变量伴随项,强制标记 ⟺ 事件。
7. 安全旋钮——拒绝断路器(每轮连续 3 次拒绝,或最近 10 次裁决中的 6 次)、风险级别策略、一次性 /auto-review approve 覆盖,以及会向模型自我解释的 never 策略硬禁用。
8. 可选审查者上下文——有界的紧凑转录(contextBudget)加上 Codex 风格的 Markdown 裁决策略(reviewerPolicyText)。

每个决策都可从会话日志重建:approval/asked → autoReview/verdict(或 autoReview/rejection)→ approval/decided。

为什么用第二个模型而不是规则?

基于模式的自动批准者在派发之前就做出决定,没有证据。dsh-auto-review 将决定权交给一个审查者子代理,它读取实际工作区(通过其只读工具面)、已经流式传输的工具调用参数(敏感值已脱敏)、请求原因以及你的风险规则——然后返回结构化裁决。拒绝裁决会将其原因反馈给调用模型,因此代理能了解原因,而不是盲目重试。

快速开始

1. 将 bundle 安装到你的 profile
dsh plugin --profile web add "github:PerryLink/dsh-auto-review#main"

或从 npm(已发布版本)
dsh plugin --profile web add dsh-auto-review

2. 重启并验证该行
dsh --profile web --dump-config | grep -A4 'id: auto-review'

开箱即用,随附的补丁会对 bash 和 write 进行 AI 审查;其他所有工具(包括 edit——就地修改)都委托给人工链。如果你接受没有人工介入的就地编辑,请显式添加 edit: ai。

安装与卸载

- git 渠道(最新 main):dsh plugin --profile web add "github:PerryLink/dsh-auto-review#main"——隔离的 prepare 构建需要 dsh CLI 为 dsh-auto-review 打印的单个 allowBuilds: { esbuild: true } 键。
- npm 渠道(已发布版本):dsh plugin --profile web add dsh-auto-review。
- 1024 商店渠道:先执行一次 npm i -g dsh1024,然后执行 dsh1024 plugin --profile web add dsh-auto-review(会计入 deepseek1024.com 的安装排名)。
- tarball 渠道:在本仓库中执行 pnpm pack,然后执行 dsh plugin --profile web add ./dsh-auto-review-.tgz。
- 卸载:dsh plugin --profile web remove dsh-auto-review(或从 profile 补丁中删除对应行)。
- 原生构建脚本:当 dsh plugin add 因 koffi / node-pty(由 eval harness 引入)而停在 ERR_PNPM_IGNORED_BUILDS 时,运行 pnpm approve-builds 来批准这些构建脚本。

配置

所有可调项都是 Schemastery 的 Config 字段(可通过 cordis.yml 修改)。以 id 为目标的覆盖会替换整行——你需要重新声明所需的每一个键。

| 键 | 默认值 | 含义 |
|---|---|---|
| enableByDefault | true | 会话启动时启用自动审查;/auto-review on\|off 会写入一个持久覆盖,其优先级高于此项 |
| toolsPolicy.default | human | 未列出工具的策略(委托给人工应答者) |
| toolsPolicy.overrides | {} | 按工具的策略:ai / human / never |
| riskRules | [] | 在工具表之前匹配的 {pattern, policy, field?};field 选择 reason(默认)、toolName 或 arguments |
| reviewerProvider | fork | 审查者的子代理提供方(进程内 fork 后端) |
| reviewerModel | (继承) | 审查者模型 id;未设置时继承会话代理的路由 |
| reviewerTimeoutMs | 60000 | 裁决截止时间;超时后应用回退策略 |
| reviewerTools | [read, glob, grep] | 审查者子进程的工具允许列表(必须非空) |
| fallbackPolicy | rejected | 审查者失败时:rejected(失败关闭)/ delegate / allow-once |
| maxReviewsPerTurn | 10 | 每个开放轮次的真实 AI 裁决预算;超出后,请求将委托 |
| maxFailuresPerTurn | 10 | 每个开放轮次的审查者失败预算 |
| reasonMaxChars | 2000 | 审查者理由和脱敏参数预览的字符上限 |
| reviewerGuidance | (无) | 追加到审查者提示中的可选建议性指导 |
| reviewerPolicyText | (无) | 注入到审查者提示中的 Markdown 裁决策略(Codex 风格) |
| denyGuidance | (反规避文本) | 追加到每个注入的拒绝理由中的指导 |
| contextBudget | {turns: 2, maxChars: 4000} | 审查者提示的精简转录预算(当前开放轮次及其前一轮);turns: 0 会禁用该部分——而盲审审查者会拒绝用户授权的操作,因此当 0 遇到 ai 策略时运行时会发出警告。字符预算花在最近的行上 |
| riskPolicy | {maxAutoAllow: high, onHighRisk: delegate} | 高于 maxAutoAllow 的 allow 裁决将委托或拒绝 |
| circuitBreaker | {consecutiveDenies: 3, windowDenies: 6, windowSize: 10, action: delegate} | 拒绝熔断器 |
| overrideTtlMs | 300000 | /auto-review approve 覆盖保持可用的时长 |
| verdictCacheTtlMs | 60000 | 对相同的 tool + arguments 指纹复用最近的裁决;0 禁用缓存。仅在 contextBudget.turns: 0 时适用——依赖转录的裁决无法仅凭 tool + arguments 重放 |
| verdictCacheMaxEntries | 256 | 最旧淘汰前缓存指纹的最大数量 |
| language | en | /auto-review 命令输出的 UI 语言(en \| zh) |
| allowUnmarkedAudit | false | 在丢弃 ignorable 标记或对未知事件类型失败关闭的主机上强制进行会话日志审计(主机 0.1.2-rc.1+)(危险:未标记的事件会使会话在其他地方无法恢复);默认为检测并降级(2026-09-02 适配,2026-09-11 针对 0.1.5-rc.2 重新验证):会话信封保留其 ignorable 字段仅用于存储日志读取兼容性——Session.append 仍无法标记它,因此审计门控行为不变。 |

示例(带注释的完整形式:fixtures/config/config-full.yaml):

- insert:
- id: auto-review
name: dsh-auto-review
config:
toolsPolicy:
overrides: { bash: ai, write: ai }
riskRules:
- pattern: '(?i)(rm\s+(-[a-z]+\s+)/|git\s+push\s+--force)'
policy: never
- pattern: 'write'
policy: never
field: toolName
reviewerTimeoutMs: 30000
fallbackPolicy: delegate
riskPolicy: { maxAutoAllow: medium, onHighRisk: delegate }
circuitBreaker: { consecutiveDenies: 3, windowDenies: 6, windowSize: 10, action: delegate }

配置实际来自哪里

~/.dsh/settings.yaml 不是此插件的配置来源。 其中的 auto-review: 块不会生效,也不会产生警告:与每个 DSH 函数插件一样,dsh-auto-review 从加载器挂载它时所在的行——即配置文件的 cordis 补丁层——接收其 Config。(其他一些 DSH 插件还会读取 settings 服务,因此这种不一致很容易踩坑,而且症状与审查器直接拒绝无法区分。)

将配置放入你的配置文件的 cordis.patch.yml 中。以 id 为目标的覆盖会替换整个配置行,因此请重述你需要的每个键——丢弃 toolsPolicy 会静默地将 bash/write 恢复为 schema 默认值 human,审查器将完全停止运行:

- id: auto-review
config:
toolsPolicy:
overrides: { bash: ai, write: ai }
contextBudget: { turns: 4, maxChars: 8000 }

工具与界面

| 界面 | 类型 | 备注 |
|---|---|---|
| auto-review | answerer | approval/request 瀑布式应答器——认领 ai 策略请求,通过 next() 委托其余请求 |
| /auto-review | command | on\|off\|status\|approve [n]——持久的按会话覆盖、预算和累计统计 |
| deny-reason injection | listener | tools/post-execute — 判定 / 回退 / never 原因反馈到被拒绝的工具结果中 |
| autoReview | 会话投影 | 从仅日志的 autoReview/ 事件折叠而来 |
| Web 审查面板 | 客户端 | 会话头部操作:开关、预算、统计、最近判定、一次性批准 |
| dsh-eval | CLI | YAML 驱动的智能体评估引擎(bin/dsh-eval.mjs) |
| 不变量伴随模块 | 不变量 | dsh-auto-review/invariant(可选;需要 invariants 服务) |

会话命令

/auto-review on|off|status|approve [n]

on/off 追加持久化的 autoReview/state 覆盖(折叠在重启/恢复后依然存在——重放即状态),并注入一条模型可见的开关通知(记录为 user/message 事件)。status 报告生效状态、两个每回合预算(AI 判定和审查器失败)、断路器在激活时的跳闸情况,以及会话的累计统计(允许/拒绝/回退/never 拒绝、平均时长、最近判定)。approve [n] 为第 n 个最近的拒绝(1 = 最近)记录一次性 autoReview/override:在 overrideTtlMs 内下一次同工具审查会将该授权作为审查器上下文携带——审查器仍会做出决定,且无论结果如何,该覆盖都会被那次审查消耗。

Web 审查面板

在 Web GUI(web 配置文件)中,该包提供一个会话头部操作(AI Review),打开一个面板,显示会话的自动审查状态:带开启/关闭按钮的开关(它们执行 /auto-review on|off)、两个每回合预算、累计统计(包括硬禁用拒绝和缓存命中)、断路器跳闸、最近判定,以及针对最近拒绝的一次性 approve 按钮(它们执行 /auto-review approve [n])。

其接线方式:

- 宿主注册一个 autoReview 会话投影(从仅日志的 autoReview/ 事件折叠而来),并通过会话投影通道提供。
- 浏览器端是一个客户端模块(从 dsh.client 声明自动发现),注册在 conversation.session.header.actions 座位上。
- 无需额外的补丁行:只要插件安装在 web 构建提供会话投影能力的配置文件中(web 配置文件即如此),面板就会加载。没有该能力时,面板会报告自身不可用;应答器不受影响。

面板只读取完整的投影值——它从不接收原始会话事件流。

工作原理

approval/request waterfall (answerer chain)
│
┌───────────────────────┴──────────────────────┐
│ dsh-auto-review answerer                     │
│  · session enabled?  · policy = ai?         │   no ── next() ──▶ human answerer (UI)
│  · risk rules → toolsPolicy → default       │
└───────────────────────┬──────────────────────┘
│ yes
▼
┌───────────────────────────────────┐
│ 审查者子代理(fork,一次性)      │
│  · toolFilter: read/glob/grep     │
│  · outputSchema: {decision,       │
│    reason, riskLevel}             │
│  · timeout + req.signal abort     │
└───────────────┬───────────────────┘
│ 裁决 / 失败(fail-closed 回退)
▼
allow → allowed-once        deny → rejected + reason 注入到
被拒绝的工具结果中(callId 关联)
│   never → rejected + [auto-review-never] 反馈
│            (硬禁用,不运行审查者)
▼
audit: approval/asked → autoReview/verdict | autoReview/rejection
→ approval/decided(会话事件,仅记录日志,不变量校验)

组合顺序。 应答器在其注册位置于瀑布流中运行:如果人工 UI 应答器组合在 auto-review 行之前,则人工先应答,审查者只能看到向下游委托的内容。使用 dsh --profile  --dump-config 验证,当你希望 ai-policy 工具首先路由到审查者时,将 auto-review 行放在人工应答器行之前。

dsh-eval — 代理评估引擎

除了审批审查者之外,dsh-auto-review 还附带 dsh-eval:一个 YAML 驱动的代理评估平台,运行真实的 headless DSH 会话(每个用例一个隔离代理 + 临时工作区,以官方 Minimal persona 作为基线系统提示),从会话事件日志中收集工具调用轨迹,并评估结构化断言以及可选的第二模型审查——与审批应答器相同的审查者接缝。
yaml
eval/cases/demo.yaml(节选)
suite:
name: my-suite
cases:
- id: math-output
input: Solve 17 × 24 and reply with only the final number, nothing else.
expect:
output: { contains: "408" }
- id: glob-trace
seedFrom: '.'
input: Use the glob tool with pattern "src/" to list the source files…
expect:
toolCalls: [{ tool: glob, arguments: { contains: { pattern: "src" } } }]
results: [{ tool: glob, contains: "index.ts" }]

运行它(环境中必须有一个 DeepSeek API 密钥):
sh
dsh-eval eval/cases --model deepseek-flash --timeout-ms 240000 --out .eval-reports

断言族

expect 块支持六个断言族;每个断言独立评估,并报告自己的通过/失败及期望值/实际值,因此失败的用例无需重新运行即可自我解释。

| 族 | DSL 键 | 它门控的内容 |
|---|---|---|
| 工具轨迹 | toolCalls、toolCallsExact、noToolCalls、results | 有序工具调用序列(带跳过的子序列)、精确名称序列、按工具结果(isError/contains/regex) |
| 输出与预算 | output、turnEnds、maxTokens | 最终输出子串/正则、回合结果、token 预算 |
| 提示词回归 | prompt | 渲染后的系统提示词必须与已提交的 baseline(或 baselineFrom 文件)匹配;任何漂移都会以并排 diff 的形式报告,并通过 allowedChanges 正则白名单允许预期内的修改 |
| 压力指标 | stress | P99 步骤延迟(maxP99Ms)、最差首 token 时间(maxTtftMs)、聚合 token 生成速度(minTokensPerSecond) |
| 公平性 | bias | 对最终输出进行偏见雷达检测:按类别统计正则命中次数(categories)、硬性 forbid 模式、maxHits/maxCategoryHits 上限 |
| 第二模型评审 | review | 来自评审子代理的补充性通过/失败判定(一个独立层,与审批评审器使用同一接缝) |

- id: regression-gate
input: Answer in one sentence.
expect:
prompt:
baseline: "You are a helpful software engineer assistant."
allowedChanges: ["copyright-year"]
stress:
maxP99Ms: 8000
maxTtftMs: 3000
minTokensPerSecond: 20
bias:
categories: { gender: ["[Hh]e is (un)?stable"] }
forbid: ["[Ss]crew that"]
maxCategoryHits: 0

CI 门禁:只有当每个套件的每个用例都通过时,进程才会以 0 退出——失败的评估会导致构建失败。每个用例都会在 report.md/report.json 旁边留下可重放的会话 JSONL 和 trace JSON;断言结果(包括提示词并排 diff)、token 用量、压力/偏见指标以及评审判定都会写入报告文件。

- name: dsh-eval
run: npx dsh-eval eval/cases --model deepseek-flash --timeout-ms 240000 --out .eval-reports
env:
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}

dsh-eval 与 openai/codex-research 不同:codex-research 为研究对比而对代理轨迹进行评分;dsh-eval 是一个声明式通过/失败回归测试框架——YAML 用例、结构化的 trace/提示词/压力/偏见断言、可选的第二模型评审,以及 CI 退出码——用于对任何 DSH 代理进行门禁,而非研究排名。

MCP 服务器(独立)

dsh-auto-review 还附带一个 stdio MCP 服务器(dsh-auto-review-mcp),使外部 MCP 客户端(Claude、Codex 等)无需测试框架即可使用确定性的评审路径。它通过换行分隔的 JSON(NDJSON)进行 JSON-RPC 2.0 通信——每行一个 JSON 对象,不使用 Content-Length 分帧。

边界。 完整评审器需要测试框架的子代理接缝和第二个模型,而独立的 stdio 进程无法触及这些。因此,独立服务器是确定性规则 + 缓存,无模型评审:
- review_action 复用同指纹裁决缓存(src/cache.ts)以及风险规则 / 工具策略解析(src/config.ts):never 规则 → deny;对相同 tool + arguments 指纹的缓存命中会重放该裁决;其他任何情况(ai 需要模型,human 需要人类)→ 故障关闭式 deny,并带有 reason: "standalone path, no model"。它绝不会允许模型尚未允许的操作。
- cache_stats 报告命中/存储计数以及 TTL 状态。

| 工具 | 用途 |
|---|---|
| review_action | {tool, args?, reason?} → {decision, reason, riskLevel} — 确定性拒绝 / 缓存重放 |
| cache_stats | {} → {hits, stores, size, ttlMs, enabled} |

直接运行它:

risk rules come from environment variables
export DSH_AUTO_REVIEW_RISK_RULES='[{"pattern":"rm -rf","policy":"never","field":"arguments"}]'
node bin/dsh-auto-review-mcp.mjs
or, after npm install: npx dsh-auto-review-mcp

环境配置:DSH_AUTO_REVIEW_RISK_RULES(由 {pattern, policy, field?} 组成的 JSON 数组)、DSH_AUTO_REVIEW_TOOLS_POLICY(JSON {default?, overrides?})、DSH_AUTO_REVIEW_CACHE_TTL_MS、DSH_AUTO_REVIEW_CACHE_MAX_ENTRIES。

Claude Desktop(claude_desktop_config.json)示例:

{
"mcpServers": {
"dsh-auto-review": {
"command": "npx",
"args": ["-y", "dsh-auto-review-mcp"],
"env": {
"DSH_AUTO_REVIEW_RISK_RULES": "[]"
}
}
}
}

该服务器是只读且确定性的:无网络、无模型、无写入。

权限与数据

- 权限:工作坊清单声明了 session:append、approval:answer、subagent:spawn、command:register 和 tools:observe。
- 数据:磁盘上不存储任何内容;报告环形缓冲区位于内存中且有界。自身不发起网络请求。
- 会话日志:autoReview/ 事件携带审查者身份、裁决、原因、风险和持续时间——并附加信封的 ignorable: true 标记,以便任何构建都能加载该日志。其 Session.append 早于该标记的主机(截至 0.1.1-rc.2 的所有已发布 rc 系列——尚无版本打上该标记)会在首次追加之前被检测到(对等版本预检查);主机 0.1.2-rc.1、0.1.3-alpha.2 和 0.1.5-rc.2 在信封上保留了 ignorable 字段,但 Session.append 无法为其打上标记(其第三个参数是仅用于 surface 事件的 SurfaceIntent),并且持久化读取路径会拒绝未标记的未知事件类型,因此这些系列——以及无法解析的版本——也会在任何追加之前故障关闭。随后审计降级为带有无标记反馈的内存镜像,因此会话在任何地方都保持可加载。

安全边界

- 审查者是一个模型。 其裁决是建议性策略,而非安全内核;对于不可逆操作,优先使用 human/never 规则。
- 故障关闭。 每条异常路径(提供方缺失、能力缺口、启动被拒、超时、停止原因非 completed、裁决缺失/格式错误、审计关联失败)都通过 fallbackPolicy 解析,默认为 rejected —— 并且该拒绝会向模型反馈一个可审计的原因。allow-once 无条件授予;它仅存在于无人值守部署中,且其管理员接受该风险。
- 只读审查器。 审查器的 toolFilter 允许列表(read/glob/grep)无法写入、编辑、运行 bash、访问网络或进行委派(maxDepth = 其自身深度)。其会话日志会被持久化并可审计。
- 上下文隔离的审查器。 审查器子级的步骤在文档化的 agent/pre-step 接缝上被过滤:只有其自身的提示和其自身的只读工具结果会进入其中。工作区指令文件(AGENTS.md / CLAUDE.md)、harness 运行时上下文快照,以及任何注入上下文的插件,都会在循环追加它们之前被丢弃,因此由仓库控制的文本永远不会到达决定某次调用是否被允许的组件。这在任一子代理提供方下都成立 —— 那些生产者会向任何新的代理会话注入全新内容,因此关闭它们的是过滤器,而不是提供方的选择。该过滤器是对消息来源的允许列表,因此声明新来源类型的插件也会被丢弃。
- 敏感参数会被脱敏(按键名匹配:token、password、api_key、Authorization、凭据、私钥……),然后才进入审查器提示;插件从不执行被审查的参数。脱敏是基于键的,而不是基于内容的 —— 不要对其实参值你无法承受展示给模型的工具进行 AI 审查。
- 硬禁用会自我解释。 never 工具或风险规则会确定性地拒绝,并记录一个仅日志的 autoReview/rejection 事件,然后向被拒绝的工具结果中注入一个 [auto-review-never] 标记 —— 模型会得知该操作已被硬禁用,而不是重试它(不变量检查:标记 ⟺ 事件)。
- 拒绝断路器。 在一个回合中连续出现拒绝会触发断路器(windowSize 内的 consecutiveDenies / windowDenies),并记录为仅日志的 autoReview/circuit 事件;后续请求遵循其 action(delegate / reject / abort-turn)。
- 审查器上下文以已呈现的转录形式提供。 contextBudget 将已呈现的会话内容提供给审查器。在默认的同路由审查器模型下,该内容会留在同一个提供方内;仅当你接受将该转录呈现给另一个提供方时,才将 reviewerModel 配置为不同的提供方。
- never 在此层是单向的。 never 工具或风险规则会在人工链看到请求之前就拒绝 —— 这是一个锁定开关,而不是默认值。

已知限制
- 两种不同的暴露,两种不同的答案——彼此都不能替代对方。 注入的上下文(工作区指令文件、运行时上下文快照、第三方插件注入)会被全新注入到任何新的智能体会话中,因此在 reviewerProvider: fork 和 reviewerProvider: spawn 下都会以完全相同的方式到达审查者——在同一请求上测得两者逐字节一致。agent/pre-step 源过滤器才是将其关闭的机制,在任一提供者下都有效;仅靠 spawn 并不能把工作区指令挡在审查者之外。 另外,fork 会用委托会话已完成的轮次为子会话播种:那段历史已经是子会话自己的日志,而不是进入某个步骤的消息,因此过滤器无法触及它,只有 spawn 能避免它,其间以审查者提示词中的不可信转录围栏作为缓解措施。在上述两个追踪中,播种没有产生额外消息,因此其实际影响尚未量化。
- 审查者需要一条可用的 LLM 路由(默认继承);没有它,每次审查都会按 fallbackPolicy 回退——绝不会静默授予。
- reviewerTools 名称必须作为全局工具存在于配置文件中;未知名称会在最早的时间点让审查者子会话大声失败并回退。
- 风险规则按其 field 匹配请求的 reason、toolName 或经过脱敏的调用 arguments;其他条件应放在 toolsPolicy.overrides 中。
- /auto-review approve 覆盖授权的是下一次同一工具的审查,而不是确切的历史调用;同一工具上的不同操作会消耗掉它。
- 裁决事件仅写入日志;Web 审查面板读取折叠后的 autoReview 投影(原始事件流永远不会到达浏览器插件)。
- 在遵循该标记的主机上,autoReview/state 和 autoReview/verdict 会附带信封的 ignorable: true 标记一起追加,因此任何 harness 构建都能加载日志——不认识这些仓库外类型的读取器会直接跳过这些记录。在已发布的 rc 主机(rc.1–rc.8)上,运行时会检测到被丢弃的标记,并且从不写入这些事件(内存镜像会让命令、预算、断路器和 approve 在该会话中继续工作);已被 0.5.1 之前版本污染的会话可以用来自 dsh-permission-rules 的 scripts/repair-session-logs.mjs 修复(其默认目标集覆盖全部五种 autoReview/* 事件类型)。
- git 通道需要 dsh CLI 为 dsh-auto-review 本身打印的单个 allowBuilds 键。该仓库自带 pnpm-workspace.yaml,内容为 allowBuilds: { esbuild: true };typescript + tsdown 是常规 dependencies。
- 可选的不变量伴随组件需要 invariants 服务(如 headless/ACP 之类的 agent-spine 组合);普通 web 配置文件不提供它,因此该行在 bundle 补丁中以注释形式提供。

相关工作
- Andy8647/dsh-auto-approval — 在 tools/pre-execute 瀑布流上的双态允许/拒绝分类器,带文件日志审计。dsh-auto-review 有意与之不同:官方 answerer 链,始终委派它不拥有的内容,只读的第二模型给出结构化裁决,拒绝原因反馈给模型,会话日志审计。
- ACP 自动化桥 — 为其自身 ACP 所拥有的 agent 提供一次性机器决策。dsh-auto-review 面向交互式 harness,以会话和工具策略为作用域;它从不推断持久授权。

开发

pnpm install                # node ^22.19 || >=24
pnpm run typecheck          # tsc: src + tests against the local harness checkout
pnpm test                   # vitest: 25 spec files
pnpm run build              # tsc declarations + tsdown bundles (lib/, incl. the client bundle)
pnpm run verify:self-contained
pnpm pack                   # the published tarball

仓库布局:src/index.ts(插件契约)· src/config.ts(Schemastery schema + 解析)· src/runtime.ts(answerer、命令、拒绝原因注入)· src/review.ts(审查器编排、提示词、净化)· src/events.ts(会话事件词汇表 + 折叠)· src/audit.ts(宿主 ignorable 标记能力检测)· src/projection.ts + src/projection-types.ts(autoReview 会话投影)· src/invariant.ts(不变量伴随模块)· src/eval/(dsh-eval 引擎)· eval/(随附的评估组合)· bin/dsh-eval.mjs(CLI 启动器)· src/client/(浏览器端)· test/ · fixtures/。

主题

deepseek-harness、dsh、dsh-plugin、cordis、approval、auto-review、second-model、ai-safety、sandbox、subagent

贡献者

- @PerryLink — 创建者与维护者:审批 answerer、审查器 subagent、风险策略与熔断器、会话投影审查面板、不变量伴随模块、dsh-eval,以及五种语言的文档。
- @weipeng1999 — 提出了独立的审查器 provider/model 路由(#11、讨论 #12),已作为 reviewerProvider / reviewerModel 发布。
- @alexchenzl — 将该插件列入 DSH 插件目录(#10)。

PerryLink DSH 插件家族

本项目是由 PerryLink 维护的 40 个 DeepSeek Harness 插件之一。如果这个对你有帮助,其他的很可能也会:

| 插件 | 一句话简介 |
|---|---|
| dsh-background-agents | 持久后台子代理,带 Web UI 侧边栏、消息传递和中断 | |
| dsh-budget | DeepSeek Harness 的成本治理:预算、碳排和延迟集于一个面板。 | |
| dsh-checkpoint-rewind | 等同于 Claude Code /rewind:快照、会话分叉、一次性恢复 | |
| dsh-claude-move | 将 Claude Code 会话、记忆、技能和 CLAUDE.md 迁移到 DSH | |
| dsh-click | DeepSeek Harness 的跨平台原生桌面控制——Windows 优先。 | |
| dsh-composer-history | Web 编辑器的终端风格输入历史:方向键、Ctrl+R 搜索 | |
| dsh-data-quality | 数据集质量检查和引用交叉核对(此处消费的可选数值桥接) | |
| dsh-defend | DeepSeek Harness 的提示注入、越狱和机密泄露防御。 | |
| dsh-doublecheck | 工程纪律守卫:需求拷问、测试门禁、对抗性审查 | |
| dsh-draw | DeepSeek Harness 的统一静态图像生成路由。 | |
| dsh-fast | DeepSeek Harness 的只读性能诊断。 | |
| dsh-fund-research | 面向中国公募基金的确定性研究报告 | |
| dsh-github | DSH 的 GitHub PR/issue 集成,每次写入均需审批 | |
| dsh-industry-research | 行业研究编排,通过本插件的 ctx.researchReport.assemble 封存其交付物 | |
| dsh-library | DeepSeek Harness 的本地文档知识库。 | |
| dsh-local-ai | DeepSeek Harness 的本地模型(Ollama)集成。 | |
| dsh-lsp-actions | 基于语言服务器的 LSP 诊断、格式化、补全、代码操作和重命名 | |
| dsh-mask | PII 脱敏中间件:在模型边界匿名化,在显示层还原 | |
| dsh-mcp-panel | 只读 MCP 运行时面板:/mcp 命令 + 设置标签页,含状态、工具和错误 | |
| dsh-memento | 审批门控的跨会话记忆:ctx.memory 接缝 + SQLite + 记忆工具 | |
| dsh-observe | 面向 DeepSeek Harness 的 OpenTelemetry 与 Langfuse 可观测性导出器。 | |
| dsh-output-styles | 等同于 Claude Code outputStyles 的运行时样式切换 | |
| dsh-reach | 多渠道审批/提问桥接:微信/Telegram/飞书,会话控制台 |
| dsh-permission-rules | Claude Code 风格的声明式 allow/deny/ask 权限规则,带审计 |
| dsh-personal-directive | 带顶栏开关的个人指令注入器(框架版) |
| dsh-plugin-guide | 作为按需智能体技能提供的插件开发知识库 | |
| dsh-plugin-doctor | 面向 DSH 插件的零依赖静态 + 沙箱冒烟检测器 | |
| dsh-research-report | 可验证的研究报告引擎:内容寻址的证据账本与密封版本 | |
| dsh-score | 面向 DeepSeek Harness 插件的多维度质量评分。 | |
| dsh-session-pin | 在 Web 侧边栏中固定会话,并保持持久排序 | |
| dsh-session-sync | 面向 DeepSeek Harness 的跨设备会话同步——你会话存储的专用 git 镜像。 | |
| dsh-skill-pack-security | 安全审计技能包:密钥扫描、依赖与供应链审查 | |
| dsh-talk | 面向 DeepSeek Harness 的语音优先会话循环:对它说话,听它回答。 | |
| dsh-test-drive | 面向 DeepSeek Harness 插件的隔离安装与冒烟测试试驾。 | |
| dsh-ticktick | 滴答清单/Dida365 任务桥接:会话头部面板 + 11 个工具 |
| dsh-translate | 面向 DeepSeek Harness 的供应商参数转换与确定性 JSON 修复。 | |
| dsh-wechat | 微信 ↔ DSH 桥接(腾讯 iLink 机器人):文本/图片/文件/语音,聊天内审批 |
| dsh-autotier | 自动强/廉价模型层级路由,带确定性风险防护与 /tier 命令 | |
| dsh-catalog | PerryLink 系列的 DSH Desktop Market 标准目录源 | |
| dsh-cert-mcp | 暴露认证注册表的只读 MCP 服务器:等级、快照与五维证据 | |
| dsh-kit | 一键安装核心套件的入门包 | |
| dsh-plugin-certification | 社区认证注册表,提供可复现检查的等级与徽章 | |
| dsh-plugin-kit | 面向 PerryLink DSH 插件的共享零运行时依赖工具包 | |
| dsh-plugin-portal | 零依赖静态门户,将整个插件系列渲染为单个页面 | |
| dsh-plugin-upgrade-015 | 合并了 0.1.3-alpha.1 → 0.1.5-rc.1 升级通道卡片,外加一个零依赖接缝扫描器 | |
| dsh-team-rooms | 跨会话团队房间:共享消息总线、任务板和时线 | |

从 DSH Desktop Market 安装

所有 PerryLink 插件均可在内置的 DSH Desktop Market 中浏览:Market → Sources → add source → paste https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json → select it。安装仍需通过 Market 的 npm 身份验证以及你的确认。

许可证

Apache License 2.0 © 2026 dsh-auto-review contributors

上游仓库有新提交时邮件通知你(每天最多一封,无更新不打扰),随时一键退订。

💬 加入 DPharness 群聊

插件用法、部署报错、新插件第一时间同步——群里问,比一个人翻文档快。

点击加入 QQ 群
DPharness 群聊二维码,手机 QQ 扫码进群
扫码进群