诚实性

没有数据,就说没有

把「没跑过」显示成 0%,你会去查一个不存在的故障。

这是最容易被做错、代价也最大的一处。

null 与 0 必须分开

缓存命中率这种指标,有两种「零」:

  • 没有数据:窗口内没有任何可测量的调用。
  • 真 0%:测到了,分母大于零,但一次都没命中。

把前者显示成 0%,你会去排查一个根本不存在的缓存故障。把后者显示成「无数据」,你会以为功能没上线,而实际上是你的提示词前缀每次都在变、缓存确实一次都没命中。两种误报的代价都是让你做出错误决定。

所以接口把两者严格分开:hit_rate 为 null 表示无数据,为 0 表示真的一次没命中。

判别只能用判等,不能用真值

!0 === true。用真值判断会把「缓存完全失效」这个最需要被看见的状态,静默地吞成「无数据」。所以只能用 === null 判断。

没测到的调用要单独显示

供应商没返回用量的调用,会从分母里排除,同时单独显示条数。否则 400/1000 = 40% 会被稀释成 400/3000 = 13.33%,看起来比实际差得多。

不可用的工具不出现在注册表

可选工具(浏览器、文档生成、LSP)依赖缺失时,它不是「出现了但一调用就报错」,而是根本不在工具清单里,并如实标注不可用。

  • 不启动假浏览器。
  • 未配置搜索提供方、或缺少凭据时,状态记为不可用、结果为空数组——不返回编造的搜索结果。
  • 沙箱后端不可用时拒绝执行,绝不回退到宿主进程跑命令。

产物要过真实格式校验

文档生成的产物先落暂存区,校验文件头与结构:PDF 必须有 %%EOF,OOXML 必须同时有 ZIP 结束记录与 [Content_Types].xml。

「把 HTML 改名成 .pdf」和截断、伪造的容器都过不去,校验失败即删除。生成脚本超时或取消时,结束整棵进程树,不留孤儿进程。

已知边界写在文档里

浏览器自动化通过我们的裁决之后,Chromium 会独立再解析一次 DNS。所以请求级复核只能收窄、不能消除这个时间窗口。

我们不声称已彻底防止 DNS 重绑定——需要硬保证时,应运行在受控代理或固定解析之下。同理,插件不是沙箱这件事也写在文档里,而不是藏在脚注。

凭据:失败不回退明文

Windows 上保存的模型密钥、配置里识别到的 token/password/secret、MCP 环境变量与请求头,使用 DPAPI 当前用户级加密。原有明文配置在读取时迁移,失败时拒绝明文回退。

需要同时说清楚:同一 Windows 账户下的恶意程序仍然可能访问这些凭据,这个机制不是进程沙箱。

一句话

一个不敢承认边界的工具,不值得把工作交给它。


这篇讲的是权限设计的一部分。回文章列表,或回首页看整体。