六档权限
你不说它能做什么,它什么都不做。各档分开授权,按设备、按工作区。
六档
| read | 读工作区里的文件。几乎每条任务都要。 |
| write | 在工作区里新建和修改文件。 |
| exec | 跑命令 —— 构建、测试、格式化、包脚本。 |
| web | 联网检索或抓取。 |
| push | 推送到远端、fetch、pull。 |
| danger | 删除或迁移数据。永远不走远程授权。 |
怎么授权
授权记在「这台设备 + 这个工作区」上。没有全局开关。
一次授权在哪里核
授权是在动作发生的地方核的,不是写进提示词里的一句「请你守规矩」。Runtime 的写、改、执行都经过 KernelHub 内建的 Tool Server,先对照授权和工作区边界核过再跑;命令还要过执行体的执行规则,每一步都记账。别的东西证不出某一档守得住时,那一家 Runtime 标成 NOT_READY,不把它算成强制。
任何授权都解不开的那部分
凭据路径 —— SSH 私钥、云配置、.env、钥匙串 —— 以及高风险动作,与你批了什么无关地被拒绝。那份清单不会因为你批了一档权限就少一条。
任务级批准
任务缺一档时会挂一张卡。批准只对那一条任务、那个工作区生效,任务一进终态立刻失效。
删除 / 迁移
这一档在手机上批不了。当一条任务会跨过这条边界、而接手的 Agent 表达不了拒绝清单时,KernelHub 会在动手之前停住,请你放行这一趟。点那张卡不批出任何一档权限 —— 拒绝清单原样不动。
「被拦下」不等于「失败了」
一条命令有两种结束方式,KernelHub 把它们分在机读字段上,不只是分在文字里:
| 被拦下 | 权限系统不让它跑。盘上什么都没发生。它出现在 blocked_actions 里。 |
| 失败了 | 它跑了,退出码非 0 —— 测试没过、构建断了。那是员工该自己处理的事,不是我们拒的。 |
分辨的依据是执行侧自己的判决记录,不看退出码,也不看错误文本的措辞。go test 退出码非 0 不是一条被拦下的动作。
三种判决,外加一个不是判决的
每一次判决只有三种取值。合并任意两种,都会丢掉一个你在屏幕上看得见的区别。
allow | 已经批过,放行。 |
need_grant | 缺一档,而那一档可以在手机上批。会挂一张卡,任务在原地等。你点头之后同一趟接着跑 —— 什么都不用重来。 |
never_granted | 这一类从不长期授权。手机上不会有卡 —— 不是我们忘了显示,是这条路只有一个出口:在那台机器上当次确认(icloser approval)。凭据、删除 / 迁移都在这一档。 |
scope_violation 不是第四种判决,它是另一格,回答的是为什么:这条路径解到真身之后落在本任务的工作区之外。它和「缺哪一档」是两个不同的问题,所以单独一格。批任何一档都解不开它。六档全开也一样 —— 工作区之间不互通。要在别的项目里干活,就把任务下到那个工作区。
为什么这几件事各占一格,而不是从那句话里读出来:措辞会改,而它一改,靠措辞识别的地方就静默地不再认得。