ttxs66666/dsh-review-gate

dsh-review-gate

Independent review gate for DeepSeek Harness: hand finished derivations and code to a reviewer subagent and feed its verdict back to the main model.

待分类ai-agentcode-reviewdeepseek-harness

dsh-review-gate

English | 中文

把数学推导、科研代码与论文草稿交给独立审查子代理审查,并把结论回注给主模型。

触发权归模型自己:插件不做自动送审、不做关键词猜测,只注入两条可编辑提醒,外加一个显式工具。

  • A —— 周期性提醒。 每 N 条真实用户消息注入一次(每个会话的第一条消息必注入;N=0 表示每条都注入),提醒模型把数学推导、科研代码、论文草稿交给子智能体独立审查,并按它的结论修正。
  • B —— 科研纪律。 派发审查时追加到送审提示词里的文案:所有参数都必须有理由——不允许无理由地出现、取值或赋值,要能说清来源、量纲与取值范围。
  • review_gate_check —— 模型(或人)显式请求一次审查。插件派一个子智能体,把结构化裁决(pass / needs_fixes / fail + 发现 + 修复要求)渲染回对话。

安装

dsh plugin --profile web add github:ttxs66666/dsh-review-gate

装完重启 dsh web。要求 DSH 在 @deepseek-ai/dsh-* 的 0.1.x 线上、不低于 0.1.5-rc.1 (^0.1.5-rc.1 || ^0.1.6-rc.1;带显式预发布分支是因为不带预发布标签的范围会静默排除所有预发布版本,详见 peerDependencies)。

你会得到什么

三个落点,读写同一个设置命名空间,改哪一处都即时生效、彼此同步:

位置slot内容
设置 → 审查门settings.section(id review-gate,order 60)完整页面:总开关、A/B 开关与文案、注入频率、审查者配置(provider / persona / 工具白名单 / 送审字符上限 / 日志开关 / 日志路径)、命令菜单开关显隐、本进程运行状态(5s 轮询)
输入框 + 菜单conversation.input.leftA/B 快捷开关,由页面里的「+ 菜单开关」控制显隐
设置 → 插件settings.plugin.item(key review-gate)精简卡:状态 + 总开关 + 指向独立页

截图(可选,供插件市场展示):把 assets/screenshot-1.png 等放进仓库,并在 package.json 旁边放一个 screenshots.json——["assets/screenshot-1.png"],1~8 张,路径相对于该文件。

设置

命名空间 review-gate(applies: live,改完即时生效,无需重启)。

组字段
A/Benabled injectA injectB promptA promptB promptAEvery showComposerToggles
审查者provider reviewerPersona reviewerTools maxArtifactChars verboseLog logFile

审查者组的解析顺序是 schema 默认值 → 插件 entry config(base 层)→ 用户层: profile 里配的值依旧是有效默认,设置页里的改动覆盖它,清空字段则回落到那份 config。

host 路由:GET /review-gate/api/status(仅回环、无需鉴权)返回生效设置、可用 subagent provider、 B 的真实投递面、本进程统计。路由不通时页面显示「宿主未连接」;通了但缺新字段(host 半没重启)时 显示「宿主版本较旧」。

几个行为约定(都是踩过坑才写进去的)

  • 工具白名单按发起审查的 agent 作用域判定。 Web 面的工具挂在 agent preset 的 standing scope 上, 全局层是空的——只查全局层会把 read/grep/glob/pwsh 这些明明看得见的工具全判成不存在。 看不见的名字会被跳过并记日志;但配置非空却一个都看不见时直接拒绝本次送审, 而不是静默退化成「不限制全部工具」。派发本身还带一层能力递减重试, 白名单最终没被运行时接受也不会让整次审查白跑。
  • provider 能力先门控再发请求。 persona / toolFilter / outputSchema 只发给声明支持它们的 provider;不支持 persona 时角色说明改为随 prompt 下发,并在裁决里注明。
  • B 的投递面如实回报,不靠假设。 0.1.5-rc.1 起内核移除了 subagents.registerContinuableSetup, 所以 B 目前只随审查子代理生效(状态 API 报 review-only);将来内核把该 API 加回来, 插件会自动回到 continuable+review。
  • 统计只在进程内存里,重载插件即归零。

开发

npm install
npm run check      # typecheck + 构建 + 冒烟探针
npm run build      # host(tsc)→ lib/index.js,client(tsdown)→ lib/client.js
npm run probe      # 零依赖冒烟探针,跑的是编译后的产物

lib/ 是刻意提交进仓库的:DSH 从 git 安装插件时不会跑构建,产物必须在仓库里。 改完 src/ 要 npm run build 并把 lib/ 一起提交。

对着本地 checkout 开发时用 npm run build:sh(DSH_CHECKOUT=<checkout> bash scripts/build.sh): 它先从已安装的 DSH 里 junction 出 peer 依赖,再编译两半。

test/ 下是两个普通 node 脚本:probe-review-gate.mjs 用假 ctx 驱动编译后的 host 半 (白名单收敛、配置错误分流、能力降级、畸形裁决、统计口径);probe-client.mjs 用迷你 React + 假 window/fetch 渲染编译后的 client 半(三个落点 + 宿主状态的两种路径)。 test/fixtures/quota-design.ts 不是插件的一部分——那是一份故意留下缺陷的推导,用来试审查门本身。

许可证

BSD-3-Clause。