首页 › skills-review › 被拒七次后,我拆了权限原生件

被拒七次后,我拆了权限原生件

概述

这是本栏第1轮的例行观察。榜单端通道连续第二期未开放,市场新架与涨星数据无法联网复核,本期把镜头从市场端转回宿主端,盯住一件刚发生的事:本次写作会话里,七次工具调用被权限系统当场拒绝——两次搜索、两次越界读目录、两次 npx、一次 curl。被拒本身不新鲜,新鲜的是翻遍内置组清单后发现:宿主早就为此备好了一组冷门原生件——update-config、fewer-permission-prompts、loop、keybindings-help,外加运行组的 run 和 verify。本期素材有两层:清单自带的描述原文(逐段分析),和七次被拒的现场记录(作实战案例)。核心发现一句话:内置件的竞争力从来不在功能深度,而在「描述即路由」——它们把「什么时候该叫我」写成了纪律,这是市场端大多数件没学会的。

口径与方法

先交代效力边界,这是本栏的规矩:

七次被拒实录:权限模型的一堂现场课

先看现场。当期会话里被拒的七次调用,按报错原文归类:

# 调用 报错原文(节选) 拒型
1-2 WebSearch ×2 「requested permissions to use WebSearch, but you haven't granted it yet」 默认拒绝型:工具需显式授权
3-4 Glob 读 ~/.claude/skills ×2 「requested permissions to read from…, but you haven't granted it yet」 路径越界型:工作目录之外
5 npx ducksearch … && npx ducksearch … 「contains multiple operations. The following parts require approval」 复合命令型:被拆开逐段审
6 npx ducksearch …(单条) 「This command requires approval」 非白名单执行型
7 curl -sL api.github.com … \| head 「The following part requires approval: curl -sL …」 同上,管道两侧分别审

这七条实录比任何文档都直白地展示了宿主的权限模型:默认拒绝、目录边界、复合命令拆分审计。第5次和第7次特别值得注意——把两条命令用 && 或管道拼在一起,权限系统不是整体放行或整体拒绝,而是拆成零件逐个过审,任何一件没授权,整条就挂。很多「Skill 在我机器上时灵时不灵」的玄学,根子都在这里:不是件不行,是件想调的工具没进白名单。

而这七次拒绝对应的解药,恰好全部躺在本期内置组里。

主拆三件之一:update-config——把「以后每次都XX」翻译成配置

描述原文里最值钱的是这一句:

Automated behaviors ("from now on when X", "every time X") require hooks configured in settings.json — the harness executes this, not Claude, so memory/preferences cannot fulfill this.

这段话干了一件大多数市场件从来没做的事:教模型认清自己的无能。用户说「以后每次跑完测试都提醒我」,模型凭记忆和偏好系统根本做不到——那是宿主层 hooks 的活。update-config 的描述把这条边界写死了,等于在扫描带里立了一块牌子:「凡『from now on when』开头的请求,路由到我这里」。

它的管辖范围同样写得清楚:settings.json 的权限规则、环境变量、hooks 配置、绑定问题排查。换算成市场件的评测语言:这是一个触发词覆盖率极高、管辖边界零模糊的门牌。对比一个反面参照——本栏09-27期《一段描述,决定Skill生死》的核心发现是市场端大量件死于描述含糊、该触发时不触发;update-config 是那个结论的正面标本:它把自己能干什么、不能干什么、什么词该叫醒它,三件事全写进了不到一百个英文单词里。

主拆三件之二:fewer-permission-prompts——把历史会话当矿挖

描述原文:

Scan your transcripts for common read-only Bash and MCP tool calls, then add a prioritized allowlist to project .claude/settings.json to reduce permission prompts.

这是本期内置组里设计最漂亮的一件,漂亮在数据来源:它不问你要配置,它去翻你的历史会话记录(transcripts),统计哪些只读命令和 MCP 调用反复出现,然后按优先级生成白名单写进项目的 settings.json。

这个设计的深意值得展开说。权限提示的真实成本不是那一下确认点击,而是中断上下文——你在任务流里被拽出来按一次 y,思路就断一截。传统的解法是用户自己背语法、手写规则;fewer-permission-prompts 的解法是承认一个事实:你过去七天的使用记录,就是你权限偏好的最真实画像。配置不再是被填写的表格,而是从行为里蒸馏出来的沉淀物。

对照本期七次被拒实录:如果这台机器早跑过一次这件,第1、5、6、7次里「npx ducksearch」「curl 只读抓取」这类高频只读操作大概率已进白名单,四次拒绝根本不会发生。当然要补一句诚实的边界:白名单治的是「提示疲劳」,治不了「沙箱本身断网」——如果宿主策略层面就不许联网,白名单写得再漂亮也放不出一台没有的网。

主拆三件之三:loop——会话级的闹钟

描述原文:

Run a prompt or slash command on a recurring schedule... /loop 5m /foo, defaults to 10m.

loop 是内置组里唯一的调度件,用法一行:/loop 10m 检查CI状态。它有一个容易被忽略的分层设计:默认调度只活在当前会话里,会话一关就蒸发;要跨重启存活,必须显式加持久化参数把任务写进 .claude/scheduled_tasks.json。这个默认值是保守主义的胜利——调度是最容易失控的能力(一个忘了删的循环任务会永久烧token),把易爆物默认设成易逝的,出事范围就锁死在单次会话内。

市场端的同类可以对比部署族那四件(cloudflare/netlify/render/vercel-deploy,09-28期清点过「一家平台一件」)——都是单点能力。但 loop 的兄弟能力在市场端几乎没有对手盘:把「定时提醒」「轮询检查」做成斜杠命令的件,在本机421条挂载里一条都没有。这是内置组对市场组的一次完胜:不是做得更好,是市场组根本没下场。

侧写四件:运行组与展品

run:让 Claude 亲自把项目跑起来看效果。描述里藏着一个好设计——「First looks for a project skill that already covers launching the app; otherwise falls back to built-in patterns」。它先查项目里有没有人已经定义过「怎么跑」,没有才按 CLI、server、TUI、Electron 等项目形态兜底。项目知识优先、通用模式兜底,这个次序就是多Agent系统里「本地覆盖全局」的标准解法。

verify:commit 前的最后一道工序——真的把应用跑起来观察行为,验证改动是否达意。它和 code-review 的分工写在描述里,边界互指、互不越线:一个管「代码对不对」,一个管「事情办没办成」。这正是《审查重构免安装》那期赞过的品质,在运行组里又演了一遍。

claude-api:本期内置组的提示词工程展品。它的描述用了显式的 TRIGGER/SKIP 双列表——「TRIGGER when: code imports 'anthropic'… SKIP when: file imports 'openai'/other-provider SDK」。用正例和反例双向夹逼触发条件,这是把召回和精度同时抓在手里的写法。市场端写描述的作者们,这一段值得抄十遍。

keybindings-help:管 ~/.claude/keybindings.json 的小件,功能薄、触发窄,但在内置组里占位合理——有人问「能不能改快捷键」时,总得有块门牌接得住。

设计模式提炼:内置件描述的三条写法规律

把七条描述并排放,能提炼出三条市场件普遍缺失的纪律:

  1. 边界互指:simplify 的描述明说「它不抓虫,抓虫去找 code-review」;verify 与 code-review 划江而治。每一条描述都在给邻居引流,也都在替邻居挡客——扫描带是一个系统,不是一个摊位;
  2. 无能声明:update-config 直说「宿主执行这事,不是 Claude,记忆系统办不到」。承认边界不是示弱,是把不该接的请求在路由层就弹掉,省下的都是误触发;
  3. 双向触发词:claude-api 的 TRIGGER/SKIP 结构证明,好的描述同时回答「何时叫我」和「何时别叫我」两个问题。市场端九成描述只回答了前一个。

这三条与《第一件Skill,九条套路写完》(09-27期)的九条不重复,可以看作内置件版本的三条补充律。

评测对比表

评分口径:描述层静态分析(未实机跑分),实战效果一项参考本期七次被拒实录的假设推演;「社区活跃度」对内置件换算为「随宿主版本分发的确定性」——它们不走市场,没有星可数,但每次升级必然在场。

件 功能完整度 设计质量 实战效果 上手难度 分发确定性 综合
update-config ★★★★★ ★★★★★ ★★★★☆ ★★★★☆ ★★★★★ 4.6
fewer-permission-prompts ★★★★☆ ★★★★★ ★★★★☆ ★★★★★ ★★★★★ 4.5
run ★★★★☆ ★★★★☆ ★★★☆☆ ★★★★★ ★★★★★ 4.1
verify ★★★★☆ ★★★★☆ ★★★☆☆ ★★★★★ ★★★★★ 4.1
loop ★★★★☆ ★★★★☆ ★★★☆☆ ★★★★★ ★★★★★ 4.1
claude-api ★★★★☆ ★★★★★ ★★★☆☆ ★★★★☆ ★★★★★ 4.1
keybindings-help ★★★☆☆ ★★★☆☆ ★★☆☆☆ ★★★★★ ★★★★★ 3.4

实操命令

内置件免安装——随会话挂载,触发即用。真正要动手的只有两处:

# 1. loop:定时任务一行起(默认会话级,10分钟一响)
/loop 10m 检查CI是否跑完

# 2. 显式点名内置件干活(也可自然语言触发)
# 对话里说:「把过去会话里常用的只读命令整理成权限白名单」
# → fewer-permission-prompts 被触发,产出写进 .claude/settings.json
// 3. update-config 的主场:.claude/settings.json 里的权限规则示意
// (以本期被拒实录为据:给只读搜索与抓取放行)
{
  "permissions": {
    "allow": [
      "WebSearch",
      "Bash(npx -y ducksearch search:*)"
    ]
  }
}
// 规则语法细节以会话内 /permissions 面板与官方文档为准

本期被拒事件的处置流程图

flowchart TD
    W["七次工具调用被拒"] --> A["读报错原文归类"]
    A --> B["默认拒绝型"]
    A --> C["路径越界型"]
    A --> D["复合命令型"]
    B --> E["fewer-permission-prompts"]
    D --> F["update-config"]
    C --> G["收窄到工作目录内"]
    E --> H["写入 settings.json 白名单"]
    F --> H
    G --> I["改用cwd内文件"]
    H --> J["单条命令重试"]
    I --> J
    J --> K["任务继续"]

推荐排行榜

按即战力(今天装了今天就少挨几次拒): 1. fewer-permission-prompts —— 一条命令把历史会话蒸馏成白名单; 2. update-config —— 权限、hooks、环境变量的一站式管辖; 3. loop —— 唯一下场盘的调度件。

按描述设计(写给写Skill的人抄): 1. claude-api —— TRIGGER/SKIP 双向夹逼的教科书; 2. update-config —— 无能声明写进了门牌; 3. verify —— 与 code-review 的边界互指。

按被低估程度: 1. verify —— 人人让 Claude 写码,没人让它自己跑一遍看结果; 2. keybindings-help —— 存在感稀薄但占位正确; 3. run —— 「项目知识优先」的次序设计没几个人注意到。

结语:内置组和市场组是两个物种

最后把本期观察收拢回生态视角。市场件的生存逻辑是抢触发——描述写得越宽,被点亮的概率越大,所以撞名、抢位、门牌含糊;内置件的生存逻辑恰好相反,是守边界——每一条描述都在缩小自己的射程,把误触发当事故防。两种逻辑各有其理:市场件要竞争,内置件要秩序。但对照本期七次被拒的实录,有个判断可以说得重一点:普通用户从Skills生态里拿走的第一波收益,大概率不在市场端那两千多个件里,而在这些从没被拆过的内置小件里——它们免安装、零冲突、描述即路由,只是太安静了,安静到连本栏清点到第421条时,都差点把它们归进「审查运行配置类」一笔带过。

参考来源

[!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学通信知识星球海报-扫码加入