跳到主要内容
返回写作

这篇记录更新了项目判断 / Stop That Shit

Stop That Shit 与 AGENTS.md 有什么区别?

Stop That Shit 与 AGENTS.md 的区别在于当前任务授权与长期仓库约定;本文说明 Skill、Guard、插件安装、SHIT 缩写和已知局限性。

本文索引07
  1. 01把抽象要求改成可检查的任务模式
  2. 02Skill 和 Guard 不应该假装做同一件事
  3. 03固定安装公开版本
  4. 04先跑一个最小 smoke,不要上来就评测模型
  5. 05边界清楚以后,再增加限制
  6. 06Stop That Shit 的局限性:返回拒绝不等于最终事实
  7. 07一份短规则,应该让任务更容易结束

Agent 做多了,最直接的修复办法通常是再加一条规则。

不要过度设计。
只做最小修改。
没有要求的事情先询问。
不要添加不必要的抽象。

下一次它还是多做,于是规则继续变长:不要随便生成 hash,不要自动加兼容层,不要默认跑全量测试,不要为了安全感写一堆免责声明。

最后,负责阻止过度工程的 AGENTS.md 自己也开始过度工程。

问题不在于这些提醒是错的,而在于“必要”“最小”“不要随便”都需要 Agent 自己解释。只要它能构造一个未来场景,就能继续证明额外工作合理。

把抽象要求改成可检查的任务模式

我做 Stop That Shit(别再造史了) 时,先没有增加更多“永远不要”的清单,而是把任务入口分成模式。

$stop-that-shit review -- Review 这个 diff,只报告问题,不要修改。
$stop-that-shit change -- 修复失败的配置测试。

reviewanswermonitor 默认是只读任务。change 才允许修改。这个区别看起来简单,却比“尽量不要乱改”清楚得多:当前动作要么在授权内,要么不在。

语义上仍然不清楚的额外工作,再经过 Stop Ladder:

用户要求了吗?
它是完成当前结果所必需的吗?
哪段可达代码、数据、部署状态或验收条件证明了这一点?
省掉它,当前任务会在哪里失败?

这两部分分别解决不同问题。任务模式给出权限边界,Stop Ladder 判断必要后果。

Skill 和 Guard 不应该假装做同一件事

Stop That Shit 的 Skill 是语义层。

它告诉 Agent:Review 不等于修改授权;不要仅因为“以后可能用得上”添加依赖、迁移、兼容层或新抽象;真正受影响的 caller、fixture 和测试仍要处理。

Skill 是 advisory guidance。它能影响模型判断,但不能保证模型行为。

Guard 是动作层。Host 把受支持的 before-action 事件交给 Hook 后,Guard 可以检查一些输入足够明确的边界:

  • reviewanswermonitor 中写文件;
  • 未经授权添加依赖;
  • 启动超过预算的 subagent;
  • 添加可识别的新 hash 操作;
  • 写入显式文件锁之外的路径。

Guard 不应该假装理解所有语义。看到 cachemigrationretry,它并不知道这一步有没有真实消费者。这样的判断仍然要回到代码、数据和验收条件。

这条边界很重要。如果 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,但不会猜测任务授权,也不会返回拒绝。显式使用 reviewanswermonitorchange 后才进入 ARMED

下面这些命令用于只读检查当前状态和事件:

$stop-that-shit status
$stop-that-shit runtime
$stop-that-shit explain evt_...
$stop-that-shit label evt_... correct|incorrect|inconclusive

Runtime 只保存元数据。permission_deny_returned 只说明 Guard 返回了拒绝响应,不能推出 Host 最终一定没有执行动作。因此公开记录把最终 Host effect 标为 unobserved

这不是一句多余免责声明,而是决定你怎样解释证据的边界:Hook 决策、Host 最终效果和模型行为是三件不同的事。

一份短规则,应该让任务更容易结束

好的 Agent 规则不是把所有坏情况列完,而是给出一个能停下来的判断。

先声明任务是 Review 还是 Change,再问额外动作有没有当前消费者、可达证据和验收后果。Guard 只拦它真正看得清的动作,语义判断继续留给 Skill 和代码事实。

这样,AGENTS.md 不需要继续长成一部过度工程百科全书。