这篇记录更新了项目判断 / Stop That Shit
Stop That Shit 与 AGENTS.md 有什么区别?
Stop That Shit 与 AGENTS.md 的区别在于当前任务授权与长期仓库约定;本文说明 Skill、Guard、插件安装、SHIT 缩写和已知局限性。
本文索引07
Agent 做多了,最直接的修复办法通常是再加一条规则。
不要过度设计。
只做最小修改。
没有要求的事情先询问。
不要添加不必要的抽象。下一次它还是多做,于是规则继续变长:不要随便生成 hash,不要自动加兼容层,不要默认跑全量测试,不要为了安全感写一堆免责声明。
最后,负责阻止过度工程的 AGENTS.md 自己也开始过度工程。
问题不在于这些提醒是错的,而在于“必要”“最小”“不要随便”都需要 Agent 自己解释。只要它能构造一个未来场景,就能继续证明额外工作合理。
把抽象要求改成可检查的任务模式
我做 Stop That Shit(别再造史了) 时,先没有增加更多“永远不要”的清单,而是把任务入口分成模式。
$stop-that-shit review -- Review 这个 diff,只报告问题,不要修改。
$stop-that-shit change -- 修复失败的配置测试。review、answer 和 monitor 默认是只读任务。change 才允许修改。这个区别看起来简单,却比“尽量不要乱改”清楚得多:当前动作要么在授权内,要么不在。
语义上仍然不清楚的额外工作,再经过 Stop Ladder:
用户要求了吗?
它是完成当前结果所必需的吗?
哪段可达代码、数据、部署状态或验收条件证明了这一点?
省掉它,当前任务会在哪里失败?这两部分分别解决不同问题。任务模式给出权限边界,Stop Ladder 判断必要后果。
Skill 和 Guard 不应该假装做同一件事
Stop That Shit 的 Skill 是语义层。
它告诉 Agent:Review 不等于修改授权;不要仅因为“以后可能用得上”添加依赖、迁移、兼容层或新抽象;真正受影响的 caller、fixture 和测试仍要处理。
Skill 是 advisory guidance。它能影响模型判断,但不能保证模型行为。
Guard 是动作层。Host 把受支持的 before-action 事件交给 Hook 后,Guard 可以检查一些输入足够明确的边界:
- 在
review、answer或monitor中写文件; - 未经授权添加依赖;
- 启动超过预算的 subagent;
- 添加可识别的新 hash 操作;
- 写入显式文件锁之外的路径。
Guard 不应该假装理解所有语义。看到 cache、migration 或 retry,它并不知道这一步有没有真实消费者。这样的判断仍然要回到代码、数据和验收条件。
这条边界很重要。如果 Hook 为了“更智能”去猜所有工程意图,它自己就会变成一个复杂、难校准的 Agent。
固定安装公开版本
当前公开 Release 是 0.1.0,需要 Node.js 18 或更高版本。Codex 安装时把 marketplace 固定到该版本:
codex plugin marketplace add lennney/stop-that-shit --ref 0.1.0
codex plugin add stop-that-shit@stop-that-shit固定 --ref 0.1.0 的作用很直接:你检查和信任的是一个确定的发布快照,而不是随时变化的 main。
安装完成后重启 Codex。在新的 CLI TUI 里输入 /hooks,检查并信任两个事件:
UserPromptSubmit:读取$stop-that-shit ...任务模式和边界;PreToolUse:在受覆盖动作执行前检查授权。
Codex 会按 Hook 定义记录信任。如果更新后定义发生变化,应重新检查。不要为了省一步直接绕过 Hook trust。
完整的 Host 安装差异以 0.1.0 INSTALL.md 为准。Claude Code、OpenCode 和 Hermes Agent CLI 共用任务边界核心,但各自的安装、事件和重启流程不同。
先跑一个最小 smoke,不要上来就评测模型
安装后的第一步不是跑一整套昂贵对照实验,而是在临时仓库检查合同切换。
先声明只读 Review:
$stop-that-shit review -- Review 这个仓库,只报告问题,不要修改。让 Agent 尝试一个受覆盖的写入。Guard 应返回拒绝。然后明确切到 change:
$stop-that-shit change -- 创建 scratch/sts-smoke.txt,内容是 pass。这次窄写入应该继续。
这个 smoke 只回答两个问题:插件有没有接入,合同能不能从只读切到修改。它不证明模型整体“更听话”,也不证明所有 Host 动作都被覆盖。
边界清楚以后,再增加限制
Stop That Shit 支持更窄的授权,但不是每个任务都要把全部选项写满。
$stop-that-shit lock change files=src/config.cjs|test/config.test.cjs -- 修复这个行为。
$stop-that-shit change deps=allow -- 添加我要求的解析器依赖。
$stop-that-shit change hash=allow -- 生成我要求的发布校验和。
$stop-that-shit change agents=1 -- 使用一个独立测试 subagent。只有完整边界已经知道时,才使用 files=。如果修改共享接口可能触达未知 caller,先检查调用链;为了显得精确而锁错文件,比不锁更容易让结果残缺。
hash=allow 也不是关闭检查。它表达的是当前任务确实授权 hash,例如 release verifier 会消费 checksum。下一项任务没有这个需求时,授权不会自动变成通用理由。
Stop That Shit 的局限性:返回拒绝不等于最终事实
安装后的默认状态是 OBSERVING / unconfirmed。Guard 可以检查并记录 covered action,但不会猜测任务授权,也不会返回拒绝。显式使用 review、answer、monitor 或 change 后才进入 ARMED。
下面这些命令用于只读检查当前状态和事件:
$stop-that-shit status
$stop-that-shit runtime
$stop-that-shit explain evt_...
$stop-that-shit label evt_... correct|incorrect|inconclusiveRuntime 只保存元数据。permission_deny_returned 只说明 Guard 返回了拒绝响应,不能推出 Host 最终一定没有执行动作。因此公开记录把最终 Host effect 标为 unobserved。
这不是一句多余免责声明,而是决定你怎样解释证据的边界:Hook 决策、Host 最终效果和模型行为是三件不同的事。
一份短规则,应该让任务更容易结束
好的 Agent 规则不是把所有坏情况列完,而是给出一个能停下来的判断。
先声明任务是 Review 还是 Change,再问额外动作有没有当前消费者、可达证据和验收后果。Guard 只拦它真正看得清的动作,语义判断继续留给 Skill 和代码事实。
这样,AGENTS.md 不需要继续长成一部过度工程百科全书。