dsh-stop-that-shit:用会话级 scope 合约审计每一次工具调用

前言

在 DeepSeek Harness(DSH)里跑智能体时,模型可以连续发起 Shell、读写文件、装依赖、派生子 agent。常见做法是事后看日志,或在 prompt 里口头约定「别动某目录」——这类约定既不结构化,也很难在每次 tool call 上强制执行。Stop That Shit(STS)的思路相反:在用户消息或斜杠命令里显式声明一份按会话生效的 scope 合约,插件在 harness 侧对每一次工具调用做审计;未武装合约前,守卫处于惰性状态,调用照常放行,只给模型一条简短提示说明尚未确认合约。

Qcsj777/dsh-stop-that-shit 是 DSH 插件 bundle:内嵌上游 lennney/stop-that-shit(MIT),并加上面向 DSH 0.2.1-rc.2 的薄适配层与 /sts 斜杠命令。社区目录分类为 admin-security;维护者为 Qcsj777。目录页:https://www.skillhub.cn/plugins/Qcsj777/dsh-stop-that-shit,源码:https://github.com/Qcsj777/dsh-stop-that-shit。

这是什么

一句话:从 $stop-that-shit … 或 /sts … 指令解析 scope 合约,武装后对 root 会话 lineage 下的每次 tool call 判准;拒绝是真实的 tool denial,事件落盘审计,数据不出本机。

与「只靠 system prompt 自律」相比,STS 把 mode、文件边界、依赖/hash 权限、子 agent 预算等写成可解析字段;解析失败则保留上一份合约并返回说明,而不是静默放宽。

核心功能

惰性守卫与合约武装

  • 未见有效 directive 时:所有 tool call 允许,模型仅看到「尚未确认合约」类 advisory。
  • 武装方式:用户消息第一行以 $stop-that-shit 或 $stop-that-shit: 开头;-- 之后或换行后的内容为任务正文,解析器忽略。
  • 运行时整句指令(仍写在 prompt 里)包括:$stop-that-shit status、runtime [all]、explain evt_<uuid>、label evt_<uuid> correct|incorrect|inconclusive 等。

合约字段(节选)

field 常见取值 默认 含义
mode answer review change monitor open unconfirmed 授权的工作类型
level watch guard lock off watch 违规时的拦截强度
files= glob\|glob 未设 文件边界,形如 src/**,不是 src/
deps= allow ask deny ask 依赖/装包权限
hash= allow ask deny deny hash/版本钉死变更权限
agents= 正整数 不限 委派预算

未知字段、冲突重复项、畸形值会被拒绝并附带 context;$stop-that-shit 不在首行则只警告,不武装。

/sts 斜杠命令

/sts 注入与用户手打等价的 directive 文本(普通 user message),走同一条武装路径,避免静默扩权。示例:

/sts                                   # 同 /sts status
/sts status
/sts review files=src/** -- look at it
/sts change lock files=src/**,test/** deps=deny hash=allow agents=4
/sts off                               # 解除武装

依赖 harness 的 commands 服务;无该服务时插件仍可加载并守卫,只是没有 /sts。

状态与会话 lineage

  • OFF:尚未见到 directive。
  • OBSERVING:见过 directive 但未确认变更权限(watch)。
  • ARMED:有效 level 下的合约生效。

审计依据调用会话所在 root 会话的合约;子 agent(root → child → grandchild)仍按 root 合约判。通过 live session store 回溯 lineage;父存在但 root 无法解析时,拒绝调用并给出「no verified root session」,不猜测。

拒绝后:模型收到原因文本,事件写入 audit,harness 仍会对 synthesized error 跑 tools/post-execute。

本地存储

默认状态目录:~/.dsh/stop-that-shit(Windows:%USERPROFILE%\.dsh\stop-that-shit)。可在 bundle patch 里改 dataDir。

<dataDir>/sessions/<sha256(sessionId)[0..24]>.json   # 合约与委派账本
<dataDir>/audit/<sessionKey>.jsonl                   # 追加式审计

纯 JSON 落盘;删除目录即重置全部合约。

安装与启用

harness 以 profile bundle 安装;包内自带 cordis.patch.yml:

- insert:
    - id: sts-bridge
      name: 'dsh-stop-that-shit'
      config:
        dataDir: ''

dataDir 为空则用上述默认目录;可指向其他路径以便按 profile 隔离状态。

从 GitHub 安装(README 原文):

dsh plugin --profile desktop add github:Qcsj777/dsh-stop-that-shit

package.json 声明引擎要求:dsh >=0.2.1-rc.2,当前包版本 0.1.0,许可证 MIT。

典型用法

1、在 profile 中按上面命令加入插件并重启或 reload harness(按你本地 DSH 习惯操作)。

2、需要改代码前,首行武装合约,后面写任务,例如:

$stop-that-shit change lock files=src/**,test/** deps=deny hash=allow agents=4 -- implement the parser

3、只想只读审视时,可缩小 mode 与 files,或用 /sts review files=src/** -- look at it。

4、查当前合约与来源:/sts status 或 $stop-that-shit status。

5、某次拦截要复盘:$stop-that-shit explain evt_<uuid>,必要时 label … correct|incorrect|inconclusive。

上游 README 注明测试可通过:

node --test test/dsh-adapter.test.cjs test/dsh-compat.test.cjs test/bridge-mount.test.cjs

(76 tests,资料记载全部通过。)

适用场景与注意

适合谁:需要在 DSH 桌面或自建 profile 里,对「能改哪些路径、能否装包、能否派 agent」做可审计、可重复约束的开发者;分类 admin-security 也表明偏向管理面与风险控制。

务必知晓:

  • 插件与 harness 同一进程权限运行;安装前应自行阅读 lib/、src/ 与 VENDOR.md,确认许可证(MIT)与 vendored 上游 commit。
  • SkillHub 等社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系;安装源以你信任的 GitHub 仓库为准。
  • watch / guard / lock 挡的是 tool 层违规,不能替代 OS 级沙箱;敏感环境应叠加系统权限与人工 review。
  • 无 commands 服务时仅缺 /sts,武装仍依赖首行 $stop-that-shit。

结尾

dsh-stop-that-shit 把 STS 的 per-session scope 合约接到 DSH 事件链上:显式武装、逐 call 审计、拒绝可解释、状态本地 JSON 留存。若你已经在用 Harness 跑长链路 agent,又希望「口头别乱动」变成可解析、可查询的合约,可以从目录页或 GitHub README 对照字段表试装一版。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye