Safety 是 kxen 的执行层硬边界。Prompt、Rules、Skills、项目配置和模型输出都不能关闭它。
判定结果
每次受保护操作会进入以下结果之一:
- Allow: 直接执行。
- Ask: 进入 Approval。
- Deny: 拒绝执行。
- Recoverable: 允许可恢复操作并记录风险。
Deny 优先于 Ask,Ask 优先于 Recoverable。
硬拒绝范围
Safety 拒绝无法安全收窄或后果不可接受的操作,包括:
- 磁盘格式化、分区和系统擦除。
- 系统关机、重启和安全配置破坏。
- Keychain、GPG 私钥和 Credential 根目录销毁。
- 数据库、Cloud 项目、Kubernetes namespace 和基础设施全量销毁。
- 批量删除 Git refs。
- 以系统目录、home 根或
.git为目标的破坏性文件操作。 - 删除目标包含未展开变量,导致范围无法静态判定。
升级审批范围
以下操作不硬拒绝,但一律升级为 Ask,由用户在 Approval 中逐次决定:
python、node、perl、ruby、osascript等解释器的-c、-e、--eval内联脚本形式。- 引号外的进程替换
<(...)和>(...)。 - 带 ref 的
git reset --hard <ref>。 git stash drop和git stash clear。git checkout --、git checkout .和git restore的工作区恢复形式(丢弃未提交改动)。
审批规则
审批卡上的「本会话放行此命令」「总是放行此命令」可以把命令全文建为前缀规则,命中后不再逐次询问:
- 匹配语义为 trim 后前缀加词边界;含 shell 元字符(
; & |、换行、反引号、$、括号、重定向、反斜杠)的命令永远不会被规则放行,也不能建规。 - Deny 判定永远先于规则表,规则不能放行硬拒绝的操作。
- 每次规则放行都先写入会话审计(decision 为
rule_allow)再执行;审计写不进去就不自动放行,回落逐次审批。 - 会话规则随进程失效;workspace 规则持久化在
<workspace>/.agents/kxen/approval-rules.json,可在设置的审批规则区块查看和撤销。 - 设置的审批审计区块按时间倒序展示全部会话的审批决定,包括规则自动放行。
可恢复删除
文件工具和 Session 删除使用系统废纸篓。Shell 中的 trash 被识别为可恢复删除。可恢复不代表可以删除系统目录或 .git。
Shell 中会造成永久删除的命令直接进入 Deny,包括 rm、rmdir、unlink、find -delete,以及通过绝对路径、command、env、xargs 或嵌套 Shell 调用的等价形式。需要删除 Workspace 文件时使用 delete tool,将目标移入系统废纸篓。
网络边界
Web 和远端 MCP 的 URL 经过地址检查。loopback、link-local、CGNAT 和内部地址不会被当作普通公网目标。
Browser 把 Chrome 的全部 HTTP、HTTPS 和 WebSocket 流量强制送入本机受控代理,不配置 direct fallback。代理在实际连接前检查单次 DNS 解析的全部结果,并使用已经检查的 SocketAddr 直连;redirect、iframe、子资源和页面脚本请求都经过相同边界。受限地址、解析歧义、超限、timeout 或代理退出都会失败关闭。动作后的 top-level URL 复查继续作为额外防线。
需要用户决定的高风险操作见 Approval。