先交代这层为什么现在才被开膛。《门原语首拆》给拦截层留的边注只有两句话:「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、有情绪化命名(名字里的那个词就是营销)。同一原理,三个海拔,三种商业模式。
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 分)——把「信任一条链」的攻击做成整发行版规模的演示,提醒所有人:单机闸只是信任链的末梢,闸层存在的终极理由写在供应链里,不在终端里。
curl --version 为此陪葬。! 预检——给自己装闸,零 token 零幻觉,所有 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 等场景全覆盖。
