跳转到主要内容
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_interpreters
  • project policy enables worktree mode relaxations
  • project policy disables destructive command protection
  • project policy disables secret protection
  • project 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
默认值:"false"
在已确认的 linked worktree 内放宽本地丢弃类 git 规则。worktree 模式放宽哪些规则、哪些从不放宽,见模式。
boolean
默认值:"true"
已注册破坏性命令规则的总开关。设为 false 会跳过除灾难性规则以外的所有已注册规则,灾难性规则始终生效。
object
默认值:"{}"
按破坏性命令规则 ID 设置的单条规则状态,值为 "on" 或 "off"。覆盖叠加在预设之上,因此 "on" 可以开启预设未开启的规则,"off" 可以关闭预设开启的规则。
string[]
默认值:"[]"
不受破坏性命令规则约束的路径。条目必须是绝对路径,或以 ~/ 开头。
boolean
默认值:"true"
机密保护总开关。设为 false 会跳过整个机密阶段,包括你配置的 deny_paths。
object
默认值:"{}"
按机密保护规则 ID 设置的单条规则状态,值为 "on" 或 "off"。大多数机密规则默认开启,因此通常写 "off"。"on" 用于启用默认关闭的编码 CLI 配置层中的规则。
string[]
默认值:"[]"
在内置敏感路径之外,额外作为机密保护的路径。校验规则见拒绝路径。
string[]
默认值:"[]"
不受内置机密模式规则约束的精确文件或目录树。配置的拒绝路径和编码 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 指定内置规则,例如:
未注册的 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" 启用默认关闭层中的规则:
未注册的 ID 会被拒绝,报 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 形式。 优先顺序是固定的:
  1. 配置的拒绝路径始终优先。同一目标同时出现在两个列表中时,结果是 secret.deny-path。
  2. 编码 CLI 凭证和配置规则(secret.cli.*)始终优先。
  3. 命中允许路径时,该目标上的其他内置机密规则都不再生效。
校验: **/ 条目从不豁免目录本身。通过符号链接到达的目标同样受允许路径覆盖。

审计保留

audit.retention_days 设置审计记录保留的天数。默认值为 30,接受的范围是 1 到 365。
超出范围的值会使运行时进入 degraded,保留期取最近的边界值;值不是整数时取 30。清理何时删除记录,参见保留期。

无效策略的行为

无效的 policy.json 永远不会阻止正常工作。CC Safety Net 保留每个有效字段,把每个无效字段替换为保护性默认值,并报告运行时为 degraded。文件缺失不算错误:CC Safety Net 使用内置默认值,运行时保持 ready。
CC Safety Net 会丢弃无效条目,而不是修复它们。拼错的拒绝路径会悄无声息地不再保护对应位置,无效的 safety.level 会悄无声息地把你降到 standard。每次手动编辑后,请运行 npx cc-safety-net status。
每个无效字段回退到什么、如何回到 ready,见配置恢复。

相关页面

模式

每项安全能力改变了什么,以及 worktree 模式放宽了哪些规则。

环境

全部变量,以及各个配置文件的存放位置。

自定义规则

用于自定义阻止规则的独立 rule.json 与 rulebook schema。

配置恢复

ready 与 degraded、各字段的回退值和修复步骤。
最后修改于 2026年10月27日