policy.json 是 CC Safety Net 的设置文件,用来选择安全预设、开关内置规则、放行或阻止特定路径,以及设置审计记录的保留时间。用户文件处处生效,提交到仓库的可选项目文件叠加在它之上。
你自己的阻止规则则写在 rule.json 和 rulebook 中,参见自定义规则。
策略文件位置
运行时在每次工具调用时读取这两个文件,因此修改会从下一条命令起生效。CC Safety Net 读取的全部文件以及
CC_SAFETY_NET_HOME 会移动哪些文件,见配置存放位置。
什么是配置工作目录
配置工作目录是智能体会话运行所在的目录。CC Safety Net 从这里读取项目的.cc-safety-net/ 目录,并以它为基准解析 deny_paths 和 allow_paths 中的相对条目。命令内部的 cd,或自带工作目录的工具调用,都不会改变它。
项目策略
把.cc-safety-net/policy.json 提交到仓库,团队就能分发一份安全策略。成员无需运行任何命令,运行时会在下一次工具调用时读取该文件。项目文件只包含它设置的字段,未写的字段从用户策略继承。
生效策略是用户策略叠加项目策略的结果:
CC Safety Net 会忽略项目文件中的
audit 部分,并报告 project policy audit settings are ignored; audit is user scope only。
用户配置目录不是项目
存放用户.cc-safety-net/ 的目录(默认是主目录)绝不会同时又是项目。在那里运行时,.cc-safety-net/policy.json 就是你的用户文件,没有项目文件叠加在它之上。写入项目文件的命令在那里会拒绝运行。参见 policy 写入哪个文件。
报告的削弱
CC Safety Net 按写下的内容应用项目策略,并把项目相对用户策略放宽的每个字段各报告一行:project policy lowers level: <user> -> <project>project policy disables fail_closed、project policy disables paranoid_rm、project policy disables paranoid_interpretersproject policy enables worktree mode relaxationsproject policy disables destructive command protectionproject policy disables secret protectionproject policy disables rule <id>project policy adds destructive allow path: <path>project policy adds secret allow path: <path>
status 在 Project policy 下列出这些行,doctor 在 Project policy deltas: 下输出它们。只要有任何削弱生效,状态行就会显示 🔻。
如何判定削弱
如何判定削弱
判断级别是否降低,以用户策略中的
safety.level 为基准;判断能力是否被关闭,以经 CC_SAFETY_NET_LEVEL 提高级别后的用户策略为基准。因此在 CC_SAFETY_NET_LEVEL=paranoid 下,项目中的 safety.overrides.paranoid_rm: false 会关闭 paranoid_rm,并作为削弱报告。设置下文的开关后,paranoid_rm 保持开启。忽略项目策略的削弱
设置CC_SAFETY_NET_PROJECT_TIGHTEN_ONLY=1 可拒绝项目策略的全部削弱。合并时会丢弃上面列出的每个字段,项目文件中收紧保护的设置仍然生效。参见环境。
被丢弃的字段仍会报告:status 列在 Project policy (ignored) 下,doctor 列在 Project policy deltas (ignored): 下,状态行不显示 🔻。policy check、policy apply 和仪表板的项目草稿都按不启用该开关的合并结果预览,反映的是没有设置该开关的成员会得到什么。
编辑策略文件
智能体在两个范围内都无法修改policy.json,阻止方式见受保护的 policy.json 文件。请用以下方式之一自己修改:
- 使用仪表板。 运行
cc-safety-net gui。它还能修复校验不通过的文件。参见仪表板。 - 直接编辑 JSON。 运行时会在下一次工具调用时读取改动,无需重启任何东西。
- 应用智能体的提案。 智能体写出提案文件,并运行
cc-safety-net policy check <file>向你展示差异。你在终端中运行cc-safety-net policy apply <file>并确认。参见policy。
degraded,说明 CC Safety Net 拒绝了文件中的部分内容,npx cc-safety-net doctor 会指出具体字段。参见无效策略的行为。
完整的策略示例
包含每个字段及其默认值:version 是必填的,省略的字段采用上面的默认值。无法识别的键,无论在顶层还是在任一部分内,都会报错。
Schema 参考
integer
必填
Schema 版本,必须为
1。这是唯一的必填字段。值缺失或错误时报告 version must be 1。string
默认值:"standard"
安全预设,取
"standard"、"strict" 或 "paranoid" 之一。strict 开启 fail_closed,paranoid 开启 fail_closed、paranoid_rm 和 paranoid_interpreters。各项能力改变了什么,参见模式。boolean
不论预设如何,显式设置 fail-closed 能力,可调高也可调低。省略该键则从预设继承。
boolean
显式设置 paranoid
rm 能力,可调高也可调低。省略该键则从预设继承。boolean
显式设置 paranoid 解释器能力,可调高也可调低。省略该键则从预设继承。
boolean
默认值:"true"
已注册破坏性命令规则的总开关。设为
false 会跳过除灾难性规则以外的所有已注册规则,灾难性规则始终生效。object
默认值:"{}"
按破坏性命令规则 ID 设置的单条规则状态,值为
"on" 或 "off"。覆盖叠加在预设之上,因此 "on" 可以开启预设未开启的规则,"off" 可以关闭预设开启的规则。string[]
默认值:"[]"
不受破坏性命令规则约束的路径。条目必须是绝对路径,或以
~/ 开头。boolean
默认值:"true"
机密保护总开关。设为
false 会跳过整个机密阶段,包括你配置的 deny_paths。object
默认值:"{}"
按机密保护规则 ID 设置的单条规则状态,值为
"on" 或 "off"。大多数机密规则默认开启,因此通常写 "off"。"on" 用于启用默认关闭的编码 CLI 配置层中的规则。integer
默认值:"30"
清理删除前保留的审计历史天数。必须是
1 到 365 之间的整数。安全级别和能力覆盖
safety.level 选择预设,safety.overrides 再逐项显式设置能力。只有这里可以调低能力。环境变量只能提高级别或强制开启能力,完整优先顺序见环境。
paranoid 预设,但不阻止解释器单行命令。只要最终的能力组合不匹配任何预设,CC Safety Net 就报告生效级别为 custom。
该用哪个允许列表
根据阻止命令的是什么来选择设置。阻止消息中会给出规则 ID。
如果想让智能体在一个草稿目录中自由工作,把该目录放在
/tmp 等临时目录下即可,那里的递归删除和 Git 丢弃操作本来就会放行。两个 allow_paths 列表相互独立,都不会放宽对方的规则。
破坏性命令保护
要允许被阻止的命令,就关闭阻止它的规则。查找规则 ID 和测试改动的步骤见允许被阻止的命令。destructive_command_protection.overrides 按 ID 指定内置规则,例如:
unknown destructive command rule id "<id>"。guard.policy-config 等固定拒绝 ID 不是规则,同样会被拒绝。"on" 或 "off" 以外的值会被拒绝,报 destructive_command_protection.overrides.<id> must be "on" or "off"。
灾难性规则无法关闭,它们会忽略 enabled: false 和 "off" 覆盖。
允许路径
destructive_command_protection.allow_paths 让递归删除把列出的每个目录都当作临时目录对待,涵盖范围见 allow_paths 下的递归删除。其校验比拒绝路径更严格:
机密保护
机密保护会阻止读写可能存有凭证的文件。全部内置规则 ID 及各自保护的路径见机密保护参考。要放行某个受保护的文件,参见允许被阻止的文件。secret_protection.overrides 按 ID 指定单条内置规则,值为 "on" 或 "off"。"off" 关闭默认开启的规则,"on" 启用默认关闭层中的规则:
unknown secret protection rule id "<id>";其他值会被拒绝,报 secret_protection.overrides.<id> must be "on" or "off"。
默认关闭的规则
编码 CLI 配置规则涵盖编码智能体的设置文件和 MCP 文件。智能体会把编辑这些文件当作日常工作,因此这些规则默认关闭,需要用显式的"on" 覆盖逐条开启。这些规则的 ID 及其路径列在机密保护参考中。
用拒绝路径阻止任意文件或目录
secret_protection.deny_paths 会阻止智能体对你指定的文件或目录的一切访问,不论其中是否存有机密。例如,不让智能体碰你的 shell 配置文件:
cat ~/.zshrc 和 echo x >> ~/.zshrc 都会以 secret.deny-path 被阻止。目录条目涵盖其中的全部内容。任何允许路径或覆盖都无法放宽拒绝路径。
校验:
拒绝路径属于机密保护,因此
secret_protection.enabled: false 也会关闭它们。secret.deny-path 不是已注册的规则 ID,因此无法用覆盖关闭它。
机密允许路径
secret_protection.allow_paths 把精确的文件,或某个目录及其全部内容,从内置机密模式规则中豁免出来。它适用于你有意保留的文件,例如仓库中的 .env.test,或其中文件形似凭证但并非机密的 fixture 目录。
条目也可以写成目录加 **/ 再加精确文件名。~/code/**/.env.local 豁免 ~/code 下任意深度的每个 .env.local,此外不豁免任何内容。不接受其他 glob 形式。
优先顺序是固定的:
- 配置的拒绝路径始终优先。同一目标同时出现在两个列表中时,结果是
secret.deny-path。 - 编码 CLI 凭证和配置规则(
secret.cli.*)始终优先。 - 命中允许路径时,该目标上的其他内置机密规则都不再生效。
**/ 条目从不豁免目录本身。通过符号链接到达的目标同样受允许路径覆盖。
审计保留
audit.retention_days 设置审计记录保留的天数。默认值为 30,接受的范围是 1 到 365。
degraded,保留期取最近的边界值;值不是整数时取 30。清理何时删除记录,参见保留期。
无效策略的行为
无效的policy.json 永远不会阻止正常工作。CC Safety Net 保留每个有效字段,把每个无效字段替换为保护性默认值,并报告运行时为 degraded。文件缺失不算错误:CC Safety Net 使用内置默认值,运行时保持 ready。
每个无效字段回退到什么、如何回到 ready,见配置恢复。
相关页面
模式
每项安全能力改变了什么,以及 worktree 模式放宽了哪些规则。
环境
全部变量,以及各个配置文件的存放位置。
自定义规则
用于自定义阻止规则的独立
rule.json 与 rulebook schema。配置恢复
ready 与 degraded、各字段的回退值和修复步骤。