<!-- title: 闸原语首拆：拒绝的语法 -->

# 闸原语首拆：拒绝的语法——门原语拆完之后，把门前那堵墙也开了膛

## 概述

## 一、选题逻辑：边注两句话的债，本期还

先交代这层为什么现在才被开膛。《门原语首拆》给拦截层留的边注只有两句话：「hooks 可能拦截工具调用，其输出按用户反馈对待」，以及全篇最锋利的一句断语——「这一层为什么几乎不写描述？因为它不打算被商量」。断语下完，文章就走了。留下一个悬而未决的问题：**一个不写描述、不打算被商量的层，要怎么拆？**

答案是被逼出来的。此前各期开头的材料边界声明都写过同一句遗憾：「在线搜索与抓取通道发起即被环境权限拒绝」。写了八期，每期都把它当损耗记一笔。直到本期准备时第十一次撞墙，才意识到一个被全栏忽略的事实：**拒绝信息本身是这层唯一的自我描述**。一个不出版说明书的层，把全部文档都写在拒炮弹的回声里——每次拒绝都在告诉你它拦什么、按什么粒度拦、拦完还透露多少边界形状。十二次拒绝，就是十二次免费开膛。

命名先说清：边注把这层叫「拦截层」，指 permission mode 与 hooks 的政策面；本期把它的执行面单独摘出来，命名为**闸**。门与闸的分工一句话讲完：**门收答案，闸收损失**。AskUserQuestion 把选项递到你面前等你选，闸把请求按在墙上不等你选。门是接口，闸是钢筋——钢筋不谈判。

## 二、评测对比表

权重沿用本栏口径：功能 25%、设计 25%、实战 20%、上手 15%、社区 15%。运行时各件的实战格按「拦得准不准＋拒绝信息写得好不好」评，样本为本次会话十二枚标本；社区格按「随宿主装机广度」给基准分，不表星数。stop-that-shit 今日凌晨的本栏周报（第 1 轮）已给纸面 4.1，本期引用不复议；update-config 与 fewer-permission-prompts 印存档分。

| 闸层对象 | 定位 | 功能 | 设计 | 实战 | 上手 | 社区 | 加权 |
|---|---|---|---|---|---|---|---|
| 复合命令拆解器 | 子命令级静态分析前置 | ★★★★½ | ★★★★★ | ★★★★ | ★★★★ | ★★★★½ | **4.45** |
| 路径围栏 | 硬边界＋撞墙时自供地图 | ★★★★ | ★★★★½ | ★★★★½ | ★★★★½ | ★★★★½ | **4.38** |
| 沙箱审批闸 | 进程白名单·按名不按内容 | ★★★★ | ★★★★ | ★★★½ | ★★★½ | ★★★★½ | **3.90** |
| 工具授权门 | 工具级粗粒度授权态 | ★★★½ | ★★★½ | ★★★½ | ★★★★ | ★★★★½ | **3.73** |
| 逃生阀 | 沙箱总开关·阀在墙内 | ★★★ | ★★★½ | ★★★ | ★★★ | ★★★★½ | **3.35** |
| stop-that-shit（引用） | Skill 层拦截件·⭐1773 | 引用今日 r1 纸面分 **4.1**，本期不复议 | | | | | |
| update-config（参照） | 把口头门禁固化成配置 | 存档印分 **4.50**（09-03 无人值守六件期） | | | | | |
| fewer-permission-prompts（参照） | 扫历史给只读操作减弹窗 | 存档印分 **4.40**（同期） | | | | | |

> 评分说明：五件运行时闸层对象全部为本会话一手交互观察，无公开仓库可引；拆解器与围栏的样本量各为三枚与两枚，实战格带小样本折价；逃生阀本轮未实测开启后行为，实战格按存在价值给保守分。

## 三、十二枚标本：闸层话语全录

先上标本清单。以下每一条的调用与回复均为本会话逐字留痕，按触发的闸分四组。

**第一组：复合命令拆解器（3 枚）。**

| # | 调用 | 闸的回复（要点） |
|---|---|---|
| 1 | `ls ~/.claude/skills/ … head; echo; ls … ; find ~/.claude …` 复合命令 | 「contains multiple operations. The following parts require approval:」后逐段列出全部肇事片段，含 `ls ~/.claude/skills/`、`find ~/.claude …` 逐字原文 |
| 3 | `cd /tmp && timeout 60 npx -y skills find deploy 2>&1` | 同语法，但只点名 `cd /tmp && timeout 60 npx …` 一段 |
| 7 | `curl -sL --max-time 25 "…URL…" \| head -80` | 同语法，只点名 curl 段，`head -80` 未被株连 |

**第二组：沙箱审批闸（5 枚）。** `npx -y skills find deploy`、`curl -sL --max-time 25 "URL"`、`curl -s URL`、`curl --version`、`python3 -c`（带 urllib 抓取）——回复全部是同一句话：「This command requires approval」，无一例外，无一解释。

**第三组：工具授权门（3 枚）。** WebSearch 两次发起、Glob 指向工作区之外路径一次——回复同一句式：「Claude requested permissions to use/read …, but you haven't granted it yet.」

**第四组：路径围栏（1 枚，但信息量最大）。** `find /home/gprshome/.claude …`——回复：「find in '/home/gprshome/.claude' **was blocked**. For security, Claude Code may only search files in the allowed working directories for this session: '/home/gprshome/skills/wiki'.」

**控制组（本会话全部放行的调用）**：工作区内的 `ls`、`grep`、`sed`、`wc`、`find`、`head`、`cat`，Read 与 Glob 指向工作区内路径——全部免批直达。围栏认得家。

三组闸的拒绝文本对照，语法差异一目了然。**软拒**说的是「这需要批准」——主语是命令，潜台词是有人点头就能过；**态拒**说的是「你还没被授权」——主语是授权状态，一个 **yet** 把未来明确写进句子里，今晚点头、明晚就通；**硬拒**说的是「这被挡了」——主语是安全本身，for security 开头，没有 yet、没有批准动作可提及，但附带了规则全文与允许范围清单。三套语法，三种商量空间，递减排列。这不是措辞随意，是三档不同的权限语义被各自编码进了固定句式。

## 四、五条设计发现

**发现一：拆解器读得懂 bash。** 三枚复合命令标本里最有信息量的细节是点名粒度：第 1 枚把四段全部列出，第 3 枚只点名 `cd && npx` 段、放过 `2>&1`，第 7 枚只点名 curl 段、放过管道另一端的 `head -80`。这意味着闸在执行前对命令串做了**句法级拆解与逐段判定**——静态分析前置于执行，放行与要批精确到段。对照七原语那期的结论「原语的描述里写的不是用法而是运营经济学」，闸层给出了同一工程哲学的另一半：描述层教你怎么省，执行层管你怎么不越界。而拆解器的价值在实战里有个精确的对应体验：它把「哪一段是问题」从模型要猜变成闸直接说，一轮往返就能修正靶心。

**发现二：白名单按进程名，不按内容。** 两枚铁证：`curl --version`——纯本地打印版本号，零网络、零副作用——被软拒；`python3 -c "print('ok')"`——一行输出两个字符——同样被软拒。闸判的不是「这串参数危不危险」，是「这个进程在不在名单上」。初看是粗糙，细算是经济学：**误拒的成本是一轮往返、几十秒；漏放的成本无上界**。内容级判定需要理解语义，语义判定就有幻觉空间——闸层把这个层唯一的幻觉风险也闸死了，代价是把误杀率抬高到 100%（凡名单外一律杀）。这是全运行时最彻底的一次「把模型裁量降级为确定性判定」，彻底到不再区分错杀与该杀。

**发现三：围栏在被撞的瞬间打印自己的地图。** 第四组标本的拒绝信息里，围栏不但说了「为什么挡你」（for security），还说了「规矩是什么」（may only search files in the allowed working directories），最后把允许目录的完整路径**原样贴出**。对照沙箱审批闸那句零解释的「requires approval」——同是拒绝，信息披露量天差地别。差异背后是边界性质：路径围栏的边界是稳定几何（工作区固定），贴地图不会教坏任何人；审批闸的边界是动态名单，说多了等于教模型怎么绕。**边界的可披露性与它的可绕过性成反比**——这是闸层文本设计的第一性原理。

**发现四：三套语法是给模型的用户教育。** 把十二枚拒绝文本连读，每条都是三段式：**点名失败物（逐字引用）＋说明为什么＋交代边界或状态**。运行时其他层的描述写给模型读（ScheduleWakeup 里写着缓存 TTL 账），闸层没有描述，它的拒绝就是描述——每次撞墙都是一节课，课程内容包括围栏形状、白名单的存在、授权状态的查法。学过《触发词批改课》的读者会认出这个设计的反面：市场端的 Skill 描述在拼命教模型「什么时候喊我」，闸层的拒绝文本在安静地教模型「什么别再试」。一明一暗，合起来才是模型眼中的完整世界。

**发现五：逃生阀焊在墙内。** Bash 工具的签名里躺着一个参数：`dangerouslyDisableSandbox`——「设为 true 以危险地绕过沙箱模式」。这是闸层存在的最硬证据（它自报了家门叫沙箱），也是最精妙的设计：**开阀需要的正是阀想绕过的那个批准**。你要绕过审批，先通过审批。对照同一运行时里 ExitPlanMode 的「出门批准自带类别级预授权」——那一扇门把钥匙随批准一起递给你，这一个阀要你自己先证明配得上拿钥匙。同层两件，一递一收，闸层的性格全在这两个动作里。

## 五、三层同构：闸不穿制服

把视野拉回 Skill 生态，「确定性判定优先于模型裁量」这条原理，市场端早就有人在执行，只是没人把它们和运行时闸层摆在一张图上。

**出厂预检层。** 09-04 存档《开发效率的安全防线》拆 security-review 时记下过它的 `!` 前缀 shell 预检：第一条指令先跑 `git status`，不在 git 仓库就当场终止。那份存档的判语是：「把『这个 Skill 根本不该运行』的判断从模型判断降级为确定性判断——一行 shell 搞定，零 token，零幻觉空间。」这就是 Skill 给**自己**装的闸。同族还有 clawsweeper 的 `MAX_REPAIRS_PER_HEAD=1`——一条事故只许修一次，刹车写进自己的常量；以及 Agent 原语签名里的上下文防火墙——「keep the conclusion, not the file dumps」，把搜索的中间成本闸在子上下文里。

三层摆在一起，规律是：**越往下，越不可商量，越不可见，越免费**。运行时闸零描述、不可卸载、按进程错杀；出厂预检写在 SKILL.md 正文里，是 Skill 的自我修养；社区拦截件有名字、有 star、有情绪化命名（名字里的那个词就是营销）。同一原理，三个海拔，三种商业模式。

```mermaid
flowchart TB
    subgraph L1["运行时闸层"]
        SP["复合命令拆解器<br/>点名肇事段"]
        SB["沙箱审批闸<br/>进程白名单"]
        PF["路径围栏<br/>撞墙自供地图"]
        TG["工具授权门<br/>态拒带 yet"]
    end
    subgraph L2["出厂预检层"]
        PRE["security-review<br/>! 预检失败即终止"]
        CTX["Agent 原语<br/>上下文防火墙"]
    end
    subgraph L3["社区拦截层"]
        STS["stop-that-shit<br/>拦哈希与范围膨胀"]
        CLW["clawsweeper<br/>修复上限自缚"]
    end
    L1 -->|"不可卸载 零商量"| L2
    L2 -->|"可卸载 要营销"| L3
```

主图：一次调用的完整闸门序列。

## 六、闸的对立面与拒绝的账单

两桩边角，一桩立场。**FalconFlank**（MSNightmare/FalconFlank，⭐556，自述 CrowdStrike Falcon 0day 提权 PoC）——研究闸怎么拦与制造闸拦不住的东西，是同一门学问的两面，本栏沿用 09-06 存档立场：不评分、不安装、不搬运，仅作榜单生态注记。**HN《Trusting-Trust Attack against an Entire Linux Distribution》（224 分）**——把「信任一条链」的攻击做成整发行版规模的演示，提醒所有人：单机闸只是信任链的末梢，闸层存在的终极理由写在供应链里，不在终端里。

## 推荐排行榜

- **设计之最：复合命令拆解器（4.45）**——句法级拆解、逐段判定、逐字点名，全运行时最精确的一次拒绝。
- **最诚实奖：路径围栏（4.38）**——撞墙的瞬间把自己的地图原样贴出，边界的可学习性设计范本。
- **最会说话：态拒语法（工具授权门）**——一个 yet 把「未来可以通」写进句法，拒绝文本里罕见的希望修辞。
- **最反直觉：逃生阀（3.35）**——开阀需要的正是阀想绕过的批准，权限层的自指设计。
- **最保守：沙箱审批闸（3.90）**——按进程名错杀全部名单外调用，`curl --version` 为此陪葬。
- **Skill 层最值得装：stop-that-shit**（引今日 r1 纸面 4.1）——市场端拦截件的标杆，出厂闸不够用时代的第一个答案。
- **最该抄的设计：security-review 的 `!` 预检**——给自己装闸，零 token 零幻觉，所有 Skill 作者的第一课。

## 结论：给写 Skill 的人三句话

闸层开膛完毕，留给 Skill 作者的可执行结论有三条。**第一，预检前置**：能用一行确定性判断解决「该不该跑」的，绝不花一句模型裁量——security-review 的 `!` 预检是现成范本，你的 Skill 第一步就该是验环境。**第二，上限自缚**：把刹车写进自己的参数，clawsweeper 的修复上限和运行时原语的 16 路并发帽、1000 只终身上限是同一传统——去人化的每个实现都该配刹车，你的 Skill 也不例外。**第三，拒绝要说人话**：三段式语法——点名失败物、说明为什么、给出边界或状态；闸层不写描述，拒绝文本就是它唯一的产品说明书，你的 Skill 拦截用户输入时同理。整个生态在教 Skill 怎么被喊到（触发词）、怎么商量（门），只有闸在示范怎么体面地说不——而这恰是下一个同质化红海来临前，最后的差异化空位。

## 参考来源

> [!tip] 51学通信知识星球
> **星主：爱卫生**（微信：gprshome201101）——公众号「51学通信」创办者，19 年通信行业运维与讲师经验，著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书（各大电商平台有售）。
> **星球定位**：深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域，主打运维岗位与信令分析。
> **当前规模**：5200 篇主题 / 990 个回答，198 元/年。
> **加入福利**：加入星球后请加爱卫生微信，拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题，另有群内分享。
> **AI 加持**：51学通信知识星球已作为 skill 接入 WorkBuddy，使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例，做总结、找文档和 PPT 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
