第 05 模块 · 1 节

安全实践与项目信任

《Pi 生产级工程》05 安全与生产交付 · 本节时长 34 分钟

生产级绕不开的一课

前面的模块教你「怎么把 pi 用起来、包出去」。生产级的另一半是**「怎么用得安全」。这一节讲安全的两根支柱:项目信任(project trust)和「没有内置沙箱」这个事实**。

先记住 pi 的定位:它是本地编码 agent,以启动它的用户权限运行,并把该用户可写的文件视为同一个本地信任边界。

贯穿项目md-tools 是要分发的包,安全就是它的「说明书」里必须写的章节。**你的 README 必须讲清楚两件事:这个包为什么需要信任、以及「项目信任不是沙箱」这个事实。** 同时,你自己的项目里那些 .pi/ 资源、AGENTS.md,也要知道它们什么时候会触发信任提示。本节就是给 md-tools 打「安全地基」的一课。

项目信任是什么、不是什么

项目信任控制的是:pi 是否加载项目本地的设置、资源、包和扩展。 关键澄清两点:

  • 不是沙箱
  • 不限制模型在你在某个目录开始工作后,能请工具做什么

一句话:信任只是「输入加载」的闸门——它防止一个仓库在你批准前静默改变 pi 的设置或扩展。它不会让不受信的代码、不受信的提示词或不受信的模型输出变安全。


什么会触发信任

pi 在以下情况下,认为项目有「需要信任的资源」:

  • 存在 .pi/settings.json
  • 存在 .pi/extensions.pi/skills.pi/prompts.pi/themes
  • 存在 .pi/SYSTEM.md.pi/APPEND_SYSTEM.md
  • 当前目录或祖先目录有 .agents/skills

注意:光秃秃一个 .pi 目录不算需要信任的项目资源。


信任决策怎么定

  • 在交互会话里,pi 会提示你信任与否,默认值来自全局设置的 defaultProjectTrust(默认是 "ask"
  • 已保存的决策按规范目录存在 ~/.pi/agent/trust.json
  • 会优先采用当前或父路径上最近的已保存决策,再回退到全局默认

信任一个项目后,pi 会加载这些受保护资源:.pi/settings.json.pi 下的扩展/技能/提示词/主题/系统提示词文件、缺失的项目包、项目本地扩展等。

不信任则跳过受保护资源。注意:上下文文件(AGENTS.mdCLAUDE.md 等)无论如何都会加载(除非禁用了上下文加载)——它们不归项目信任管。


非交互模式的信任行为

-p--mode json--mode rpc 这些非交互模式不会弹信任提示。它们的行为取决于是否有适用的已保存决策:

  • defaultProjectTrust: "ask""never"忽略这些资源
  • "always"信任它们

要单次覆盖,用 --approve/-a--no-approve/-na。这对 CI、对跑 md-tools 的自动化很重要——别让脚本在无人值守时意外加载了不受信设置


没有内置沙箱:正确看待

pi 不包含内置沙箱。内置工具能以 pi 进程的权限读文件、写文件、编辑文件、跑 shell 命令;扩展是 TypeScript 模块,也以同样的权限运行。装包、跑 shell、语言服务器、测试命令,都是普通本地进程的行为。

这是故意的:pi 设计成在本地源码树上工作、调用项目工具链、融入现有开发环境。一个「部分进程内沙箱」容易被误当成安全边界,却仍依赖宿主 shell、文件系统、包管理器、凭据和扩展代码。

真正的隔离来自操作系统或虚拟化/容器边界。


跑不受信或无人值守任务怎么办

对不受信的仓库、你不打算密切盯着的生成代码、或无人值守的自动化,官方建议在受控环境里跑:

  • 把整个 pi 进程放进容器/沙箱
  • 只挂载 agent 该访问的工作区路径
  • 避免挂载宿主 ~/.pi/agent(除非容器该访问宿主的会话、设置和凭据)
  • 传最小必需的 API key,或用短期凭据
  • 任务不需要时限制网络访问
  • 把结果拷回可信系统前,先审查 diff 和输出

如果你以读写方式 bind-mount 宿主工作区,容器/VM 里的写入仍能改宿主文件。想要更强的防误写保护,用只读挂载,或把文件拷进拷出沙箱。


落地练习:检查你的项目会触发什么信任

给 md-tools 项目做一次安全体检:

  1. 在项目根运行 ls -a,找出 .pi/.agents/AGENTS.md 等资源
  2. 用上面的「触发信任」清单逐条对照,判断它会不会触发信任提示
  3. 想清楚:如果是,默认 "ask" 下别人首次打开会看到什么提示

怎么判断做对了?——你能判断出 md-tools 项目「需要信任」还是「不需要」;并且知道在 CI / 无人值守场景下,该用 --approve 还是 --no-approve

卡住了怎么办? 不确定某目录算不算?对照官方列出的资源清单,.pi 光秃秃不算、.pi/settings.json 才算。想让脚本自动跑?先想清楚它的 defaultProjectTrust 是什么。


常见坑:把「项目信任」当成沙箱

最危险的误解,是把项目信任当「沙箱」——以为「我信任了这个项目,所以它安全」。

完全相反。 信任只是决定「加载哪些项目设置和扩展」;它既不隔离模型,也不隔离扩展。信任了一个恶意仓库,等于给它的扩展开了绿灯。安全边界只来自操作系统/容器/VM。信任 ≠ 安全,审查 + 隔离才等于安全。


小结

  1. 项目信任控制是否加载项目本地设置/资源/包/扩展,不是沙箱
  2. .pi/settings.json.pi/* 资源、.agents/skills 会触发信任
  3. 决策存 trust.json,非交互模式不弹提示
  4. pi 无内置沙箱,真正的隔离靠容器/VM
  5. 跑不受信/无人值守任务要在受控环境里,用最小凭据

下一节,讲怎么用 compaction 优化上下文。