Repository navigation
Releases: MrChengl11/Stop-That-Shit-DSH
Release list
v0.2.0 — shell 写目标证明 / 依赖授权顺序
问题
在 files= 边界下,凡是用 shell 写文件(mkdir、touch、git add、> file)都会被判
WRITE_PATH_UNPROVEN,即使目标就在边界内 —— 因为上游判定引擎拿不到写目标路径。
修复
| 修复 | 位置 | 效果 |
|---|---|---|
| A. 证明 shell 写目标 | vendor-sts/src/shell-analysis.cjs |
mkdir -p src/new → ["src/new"];echo hi > src/out.txt → ["src/out.txt"];git add -A 这类不指名目标的仍为 [] |
| A′. 适配层并集 | lib/adapter.js |
shell 分析出的路径并入 affectedPaths,files= 边界能真正按路径判定 |
| B. 依赖授权先于文件边界 | vendor-sts/src/decision.cjs |
deps=allow 下装依赖不再被路径检查抢占;deps=ask / deps=deny 不变 |
行为变化(change + files=src/**)
| 场景 | v0.1.0 | v0.2.0 |
|---|---|---|
touch src/app.ts |
deny WRITE_PATH_UNPROVEN |
allow |
echo hi > src/out.txt |
deny WRITE_PATH_UNPROVEN |
allow |
touch README.md |
deny WRITE_PATH_UNPROVEN |
deny PATH_OUTSIDE_CONTRACT(理由变准确) |
git add -A |
deny WRITE_PATH_UNPROVEN |
不变(不指名目标) |
npm run build / node scripts/build.js |
deny WRITE_PATH_UNPROVEN |
不变(无法证明目标,仍 fail-closed) |
deps=allow + npm install yaml |
deny WRITE_PATH_UNPROVEN |
allow |
验证
node test/conformance.mjs # 56/56 checks passed(不调模型)
断言从 49 条扩到 56 条:原来「mkdir -p src/new 应报 WRITE_PATH_UNPROVEN」那条已过时,
拆成界外已证明目标 / 界内已证明目标 / 不指名目标三条;另加 deps=allow 与 deps=deny 两条依赖授权顺序回归。
安装
tar -xzf dsh-stop-that-shit-0.2.0.tgz
cd package && node install.mjs详情见 CHANGELOG.md。
v0.1.0 — Stop That Shit for DeepSeek Harness(二次开发)
Stop-That-Shit-DSH v0.1.0
Stop That Shit 的 DeepSeek Harness 适配层首个版本。
⚠️ 这是二次开发(derivative work),不是上游官方项目。
上游:lennney/stop-that-shit v0.2.5,MIT,作者 "Stop That Shit contributors"。
上游没有 DeepSeek Harness 适配器;本仓库只补宿主粘合层,判定引擎(vendor-sts/)一行未改。
装什么
三样东西:
dsh-stop-that-shit-0.1.0.tgz—— npm 包(42 个文件,含上游vendor-sts/,无运行时依赖)- Source code (zip / tar.gz) —— 完整仓库快照
快速开始
# 1. 解剖到任意 DSH profile
tar -xzf dsh-stop-that-shit-0.1.0.tgz
cd package
node install.mjs --profile <your-profile>
# 2. 或者在 profile 里当普通依赖装
dsh plugin --profile <your-profile> add /path/to/packageinstall.mjs 是幂等的:复制到 ~/.dsh/plugins/dsh-stop-that-shit、建 junction、往 profile 的
dependencies 和 dsh.profile.bundles 里各写一条。--uninstall 反向操作。
装完不需要重启——profile HMR 会现场 reconcile 新的 bundle。
怎么用
会话第一条消息:
$stop-that-shit change files=src/** -- 修掉那个登录 bug
之后所有落在 src/ 之外的写操作会被拒绝,模型看到的是:
Error: STOP / SCOPE
Guard returned a pre-execution denial.
Reason: PATH_OUTSIDE_CONTRACT
Detail: The action writes outside the declared file boundary: src/outside.ts.
Code: S/PATH_OUTSIDE_CONTRACT
State: ARMED / change
Next: Keep the write inside files=..., or obtain a new explicit file boundary.
模式:answer / review / change / monitor / open。
档位:watch(默认,只提示)/ guard(拦)/ lock(连状态查询都收紧)/ off。
其余字段:files=a|b、deps=deny|ask|allow、hash=deny|ask|allow、agents=N。
查询:$stop-that-shit status(整条消息只能有这一句)。
自然语言纠偏也认:stop / review only / 只审查 / 只回答 / 只监控。
这一版的验证程度
| 层 | 证据 |
|---|---|
| 判定引擎 | 上游 v0.2.5 原样收录,未改一行 |
| 适配层 | test/conformance.mjs 49/49 passed(零模型调用) |
| 端到端 | e2e/ 真实 headless DSH 启动 + 真实模型 turn |
| 活会话 | 在真机桌面版里逐项实测:越界写 / review 模式写 / hash=deny / agents=0 / deps=ask 全部正确拒绝;未布防时全放行 |
| PTC 嵌套 | run_code 内派发的 write/read/subagent 同经 tools/pre-execute,同样被拦 |
| 打包 | 从 .tgz 解包后复跑 49/49,且能正常 import() 成 cordis 插件 |
已知限制
- 这是 guardrail,不是 security boundary。 真正的边界仍是 DSH 的 sandbox 与 permission 设置。
- 只覆盖经过工具调用的动作;模型直接输出的文本不归它管。
- 上游的
SessionEnd/PostToolUseFailure/PermissionDenied三个事件在 DSH 侧没有对应缝隙,未接线。 - 武装状态下每次工具调用走一次上游判定,无子进程开销(in-process),但仍是同步路径上的工作。
兼容性
- DeepSeek Harness 0.2.1-rc.2 / 0.2.1-rc.3
- Node.js >= 22
- 上游 stop-that-shit v0.2.5
仓库
lib/本仓库新增的适配层(DSH 扩展点 → 上游 ControlEvent v2)vendor-sts/上游源码,原样(MIT)docs/01–05取证与设计记录(含兼容性判定、原生插件设计,中文)NOTICE.md二次开发声明,中英双语